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

Ответы на вопрос(1)

Решение Вопроса

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

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

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

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

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

Ваш ответ на вопрос