А как насчет следующего?
const std::optional<std::string>
Все в стандартной библиотеке будет const
-корректным - поэтому все методы доступа на optional
все const
- квалифицируется как соответствующий.Вызов value()
или operator*()
на const optional<T>
даст вам const T&
(или const T&&
), а не T&
.
У вас нет прямого доступа к изменяемой ссылке.
Обратите внимание, что если у вас есть const optional<int*>
, то, с другой стороны, сам указатель является const
, а не указателем.Так что это нормально:
int i = 42;
const std::optional<int*> opt(&i);
*opt.value() = 57;
assert(i == 57);
Является ли содержимое const std::optional
всегда const
?
Технически, вышеприведенное фактически не отвечает на ваш вопрос.const std::optional<std::string>
не содержит const std::string
- он содержит std::string
, к которому он предоставляет только const
доступ.Итак ... технически ... но на самом деле никогда не делайте этого всерьез, это плохо ... это хорошо определено:
const std::optional<std::string> opt("hello"s);
const_cast<std::string&>(opt.value()) = "I am a bad person and I feel bad"s;
Поскольку сам string
никогда не создавался как const
.