Вопрос по c++, boost, boost-optional – Каково обоснование для реализации boost :: none_t?

24

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
Нет, переоткрыл это сам: / Утра трудные: / Matthieu M.
Я только что понял (заняло у меня некоторое время ...), что это именно структураSafe-Bool Idiom. Matthieu M.
@MatthieuM .: Ты имеешь в виду, что ты только что прочитал комментарий Наваса, опубликованный к твоему ответу в июне 2012 года? ;) Luc Touraille

Ваш Ответ

1   ответ
17

Одно (более или менее очевидное) преимущество перед обычнымstructэто сейчасnone оцениваетfalse в булевых контекстах.

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

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

EDIT: One should recognize here (hum...) the structure of the Safe Bool Idiom.

Ах ...boost::none действительно превращается вfalse, : D
Во всяком случае, другими словами, это просто следуетSafe Bool Idiom.
@LucTouraille: хорошо, я полагаю, что тот же аргумент может быть использован противnullptr; поскольку они оба выполняют одну и ту же роль, вполне логично, что они ведут себя одинаково во многих обстоятельствах.
Это имеет смысл, хотя я действительно не вижу смысла вnone конвертируемый вfalse, ИМХО, это может только создать ложное впечатление, чтоnone являетсяoptional, Но, возможно, я пропускаю некоторые угловые случаи, ожидаемые авторами библиотеки. Luc Touraille

Похожие вопросы