2010-02-25 16 views
10

En boost::detail::addressof_impl::f() una serie de reinterpret_cast s se hace para obtener la dirección real del objeto en caso de class T ha sobrecargado operator&():¿Por qué y cuándo se convierte en carbón volátil y necesario?

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))); 
    } 
} 

¿Cuál es el propósito de yeso para const volatile char& en lugar de limitarte a enviar a char&?

Respuesta

8

un reparto directamente a char& fallaría si T tiene const o volatile calificadores - reinterpret_cast no pueden eliminar estos (pero puede añadirlos), y const_cast no pueden realizar cambios de tipo arbitrarias.

4

El objeto puede ser const o volatile, o ambos (como oxymoronic como que puede ser), en cuyo caso es probable que sea ilegal reinterpret_cast a un tipo que carece de estos atributos. (Ir en la dirección opuesta nunca es un problema, por supuesto).

+8

No es oximorónico ser 'const' y' volátil'. Por ejemplo, un registro de hardware de solo lectura que proporciona un valor diferente cada vez que se lee, o un objeto de solo lectura en la memoria compartida que se actualiza mediante otro proceso, debe tener ambos calificadores. –

+1

Sí. Ese aspecto de const es de hecho confluente con volátil. – Ari

Cuestiones relacionadas