Зачем std::optional
(std::experimental::optional
в Libc ++ на данный момент) не имеет специализации для ссылочных типов (по сравнению с boost::optional
)?
Я думаю, что это был бы очень полезный вариант.
Есть ли какой-то объект с ссылка на может быть уже существующий объект семантика в СТЛ?
когда n3406 (редакция № 2 предложения), некоторые члены комитета были неудобны с дополнительными ссылками. В n3527 (редакция № 3), авторы решили сделать необязательные ссылки вспомогательным предложением, чтобы увеличить шансы на получение необязательных значений, утвержденных и помещенных в то, что стало C ++ 14. Хотя необязательный не совсем вошел в C ++ 14 по ряду других причин, комитет не отклонил необязательные ссылки и может добавлять дополнительные ссылки в будущем, если кто-то предложит это.
Там действительно что-то, что имеет ссылка на может быть существующий объект семантика. Это называется (const) указатель. Простой старый не владеющий указатель. Есть три различия между ссылками и указателями:
std::optional
,->
или же *
, Это чистый синтаксический сахар и возможно из-за 1. И синтаксис указателя (разыменование и преобразование в bool) — это именно то, что std::optional
обеспечивает доступ к значению и проверку его наличия.Обновить:
optional
это контейнер для значений. Как и другие контейнеры (vector
например) это не предназначенный содержать ссылки. Если вам нужна дополнительная ссылка, используйте указатель или вам действительно нужен интерфейс с похожим синтаксисом для std::optional
создайте небольшую (и тривиальную) оболочку для указателей.
Update2: Что касается вопроса Зачем такой специализации нет: потому что комитет просто отказался от нее. Обоснование может быть быть найденным где-нибудь в газетах. Возможно, это потому, что они считают указатели достаточными.
Если бы я рискнул предположить, это было бы из-за этого предложения в спецификации std :: эксперимент :: необязательно. (Раздел 5.2, р1)
Программа, которая требует реализации шаблона
optional
для ссылочного типа или для, возможно, cv-квалифицированных типовin_place_t
или же
nullopt_t
плохо сформирован.