Подтвердить что ты не робот

В чем смысл внедрения 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
4b9b3361

Ответ 1

А, я никогда не думал, чтобы копать глубже.

Одно (более или менее очевидное) преимущество для обычного struct заключается в том, что теперь none оценивается false в булевых контекстах.

Одно преимущество над другим "оценивается как ложное" заключается в том, что указатель на элемент предотвращается от вредоносного продвижения до целых типов.

Итак, я предполагаю, что он предлагает безопасный и сжатый способ иметь объект, который оценивает false.

РЕДАКТИРОВАТЬ: Здесь следует признать (гул...) структуру Safe Bool Idiom.