在boost::detail::addressof_impl::f()中完成了一系列reinterpret_cast
以获取对象的实际地址,以防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&
的目的是什么?
答案 0 :(得分:9)
如果char&
有T
或const
限定符,volatile
无法移除这些(但可以添加),则直接转换为reinterpret_cast
会失败,const_cast
无法进行任意类型更改。
答案 1 :(得分:4)
对象可能是const
或volatile
,或者两者兼而有之(这可能是矛盾的),在这种情况下reinterpret_cast
对于缺少这些对象的类型可能是非法的属性。 (走向相反的方向当然不是问题)。