问题 为什么以及什么时候被转换为char volatile并且需要?


提高::详细:: addressof_impl :: F() 一系列 reinterpret_casts完成以获取对象的实际地址以防万一 class T 已超载 operator&()

template<class T> struct addressof_impl
{
    static inline T* f( T& v, long )
    {
        return reinterpret_cast<T*>(
            &const_cast<char&>(reinterpret_cast<const volatile char&>(v)));
    }
}

投射的目的是什么? const volatile char& 而不只是铸造 char&


5727
2018-02-25 12:36


起源



答案:


直接演员 char& 会失败的 T 具有 const 要么 volatile 资格赛 - reinterpret_cast 不能删除这些(但可以添加它们),和 const_cast 无法进行任意类型更改。


9
2018-02-25 12:57





对象可能是 const 要么 volatile或者两者兼而有之(如同可能的那样),在这种情况下,它可能是非法的 reinterpret_cast 它属于缺乏这些属性的类型。 (走向相反的方向当然不是问题)。


4
2018-02-25 12:56



两者都不是矛盾的 const 和 volatile。例如,每次读取时给出不同值的只读硬件寄存器,或者由另一个进程更新的共享存储器中的只读对象,应该具有两个限定符。 - Mike Seymour
对。 const的这个方面确实与volatile相融合。 - Ari


答案:


直接演员 char& 会失败的 T 具有 const 要么 volatile 资格赛 - reinterpret_cast 不能删除这些(但可以添加它们),和 const_cast 无法进行任意类型更改。


9
2018-02-25 12:57





对象可能是 const 要么 volatile或者两者兼而有之(如同可能的那样),在这种情况下,它可能是非法的 reinterpret_cast 它属于缺乏这些属性的类型。 (走向相反的方向当然不是问题)。


4
2018-02-25 12:56



两者都不是矛盾的 const 和 volatile。例如,每次读取时给出不同值的只读硬件寄存器,或者由另一个进程更新的共享存储器中的只读对象,应该具有两个限定符。 - Mike Seymour
对。 const的这个方面确实与volatile相融合。 - Ari