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

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

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

Есть ли какой-нибудь объект со ссылкой на возможно уже существующую семантику объекта в STL?

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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