В чем смысл внедрения boost:: none_t?
Boost.Optional использует фиктивный тип, позволяющий создавать неинициализированные экземпляры boost::optional<T>
. Этот тип называется none_t
, а экземпляр none
уже определен в заголовке для удобства, что позволяет нам писать код, например:
boost::optional<int> 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<none_t>(0)) ;
} // namespace boost
В чем преимущества использования такого запутанного typedef над простой пустой структурой, как это?
namespace boost {
struct none_t {};
none_t const none;
} // namespace boost
Ответы
Ответ 1
А, я никогда не думал, чтобы копать глубже.
Одно (более или менее очевидное) преимущество для обычного struct
заключается в том, что теперь none
оценивается false
в булевых контекстах.
Одно преимущество над другим "оценивается как ложное" заключается в том, что указатель на элемент предотвращается от вредоносного продвижения до целых типов.
Итак, я предполагаю, что он предлагает безопасный и сжатый способ иметь объект, который оценивает false
.
РЕДАКТИРОВАТЬ: Здесь следует признать (гул...) структуру Safe Bool Idiom.