c++ boost boost-optional

c++ - ¿Cuál es el fundamento de la implementación de boost:: none_t?



boost-optional (1)

Boost.Optional utiliza un tipo ficticio para permitir la construcción de instancias no inicializadas de boost::optional<T> . Este tipo se llama none_t , y una instancia none ya está definida en un encabezado por conveniencia, lo que nos permite escribir código como el siguiente:

boost::optional<int> uninitialized(boost::none);

Mirando la definición de none_t , noté que de hecho es un typedef que corresponde a un puntero-a-miembro de alguna estructura ficticia:

namespace boost { namespace detail { struct none_helper{}; } typedef int detail::none_helper::*none_t ; none_t const none = (static_cast<none_t>(0)) ; } // namespace boost

¿Cuáles son las ventajas de usar un typedef tan complicado en una simple estructura vacía como esta?

namespace boost { struct none_t {}; none_t const none; } // namespace boost


Ah, nunca pensé ahondar más.

Una ventaja (más o menos obvia) de una struct regular es que ahora none evalúa como false en contextos booleanos.

Una ventaja sobre otra "evalúa a falso" es que se impide que el puntero al miembro promueva daños a tipos integrales.

Entonces, supongo que ofrece una forma segura y concisa de tener un objeto que se evalúa como false .

EDITAR: Uno debe reconocer aquí (hum ...) la estructura de la fraseología de Safe Bool .