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 .