Boost.Optional использует фиктивный тип, позволяющий создавать неинициализированные экземпляры boost::optional<T>
. Этот тип называется none_t
, а экземпляр none
уже определен в заголовке для удобства, что позволяет нам писать код, такой как:Какое обоснование для внедрения boost :: none_t?
boost::optional<int> uninitialized(boost::none);
Глядя на определение none_t
, я заметил, что это на самом деле ЬурейиЙ соответствующий указатель на член в некоторую фиктивную структуру:
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
Каковы преимущества использования такого замысловатый ЬурейеГо над простой пустой структурой, как это?
namespace boost {
struct none_t {};
none_t const none;
} // namespace boost
Я только что осознал (взял меня на время ...), что это именно структура [Идиомы Safe-Bool] (http://www.artima.com/cppsource/safebool.html). –
@MatthieuM .: Вы имеете в виду, что вы только что прочитали комментарий Nawaz отправили на ваш ответ в июне 2012 года ..? ;) –
Нет, заново открыл его самостоятельно:/Утром сложно:/ –