Boost.Optionalиспользует фиктивный тип, позволяющий создавать неинициализированные экземпляры boost::Optional
. Этот тип называется none_t
, а экземпляр none
уже определен в заголовке для удобства, что позволяет нам писать следующий код:
boost::optional uninitialized(boost::none);
Глядя на определение none_t
, я заметил, что на самом деле это typedef, соответствующий указателю на член какой-то фиктивной структуры:
namespace boost {
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
none_t const none = (static_cast(0)) ;
} // namespace boost
Каковы преимущества использования такого сложного typedef по сравнению с такой простой пустой структурой?
namespace boost {
struct none_t {};
none_t const none;
} // namespace boost