2014-11-11 4 views
12

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

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

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

+9

В заключение я пришел к выводу, что я могу использовать 'std :: optional >' для моих целей. – Orient

ответ

7

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

0

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

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

+2

Возможно, это правильно, но я не могу понять предысторию умозаключения. – Orient

+0

@Orient, который является стандартным для «опционального», не может использоваться со ссылками и этими двумя специальными типами »- другими словами, он не предназначен для работы с ними. На самом деле, ваш вопрос - это еще один способ сказать: «Почему стандарт содержит эту статью?» –

+1

@ArneMertz Вы правы, но важно понимать намерения кометы. – Orient

4

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

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

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

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

+10

Тем не менее, для универсального программирования вы бы хотели: 'std :: optional ' wo работать, даже когда 'T == U &'. Вы достаточно хорошо объясняете, как 'std :: optinal ' может быть реализован с помощью 'U * const', но это не помогает в общем программировании. – MSalters

+2

@MSalters Я не понимаю, зачем вам это нужно. 'optional' строго для значений. См. Мое обновление ответа. «универсальное программирование» не является оправданием бланко, чтобы иметь что-либо, что можно вообразить. Если вам посчастливилось встретить случай, когда вы хотите поддерживать необязательные значения * и * необязательные ссылки, используйте специализацию для distingusih между 'optional' и указателями или класс оболочки, о котором я упоминаю. –

Смежные вопросы