std :: дополнительная специализация для ссылочных типов

Зачем std::optional (std::experimental::optional в Libc ++ на данный момент) не имеет специализации для ссылочных типов (по сравнению с boost::optional)?

Я думаю, что это был бы очень полезный вариант.

Есть ли какой-то объект с ссылка на может быть уже существующий объект семантика в СТЛ?

18

Решение

когда n3406 (редакция № 2 предложения), некоторые члены комитета были неудобны с дополнительными ссылками. В n3527 (редакция № 3), авторы решили сделать необязательные ссылки вспомогательным предложением, чтобы увеличить шансы на получение необязательных значений, утвержденных и помещенных в то, что стало C ++ 14. Хотя необязательный не совсем вошел в C ++ 14 по ряду других причин, комитет не отклонил необязательные ссылки и может добавлять дополнительные ссылки в будущем, если кто-то предложит это.

14

Другие решения

Там действительно что-то, что имеет ссылка на может быть существующий объект семантика. Это называется (const) указатель. Простой старый не владеющий указатель. Есть три различия между ссылками и указателями:

  1. Указатели могут быть нулевыми, ссылки не могут. Это именно та разница, с которой вы хотите обойти std::optional,
  2. Указатели могут быть перенаправлены, чтобы указывать на что-то еще. Сделайте это постоянным, и эта разница также исчезнет.
  3. Ссылки не должны быть разыменованы -> или же *, Это чистый синтаксический сахар и возможно из-за 1. И синтаксис указателя (разыменование и преобразование в bool) — это именно то, что std::optional обеспечивает доступ к значению и проверку его наличия.

Обновить:
optional это контейнер для значений. Как и другие контейнеры (vectorнапример) это не предназначенный содержать ссылки. Если вам нужна дополнительная ссылка, используйте указатель или вам действительно нужен интерфейс с похожим синтаксисом для std::optionalсоздайте небольшую (и тривиальную) оболочку для указателей.

Update2: Что касается вопроса Зачем такой специализации нет: потому что комитет просто отказался от нее. Обоснование может быть быть найденным где-нибудь в газетах. Возможно, это потому, что они считают указатели достаточными.

6

Если бы я рискнул предположить, это было бы из-за этого предложения в спецификации std :: эксперимент :: необязательно. (Раздел 5.2, р1)

Программа, которая требует реализации шаблона optional
для ссылочного типа или для, возможно, cv-квалифицированных типов in_place_t или же
nullopt_t плохо сформирован.

0
По вопросам рекламы [email protected]