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
плохо сформирован.
Ответ 4
Здесь вы найдете хорошее объяснение, почему у нас не должно быть этого типа: https://foonathan.net/blog/2018/07/12/optional-reference.html