Ответ 1
Каков аргумент, который opt = j должен перепроверять базовую ссылку?
Я не знаю, что такое "аргумент", который вы ищете. Но вы только что представили для него "аргумент":
optional<T&> opt;
opt = i;
opt = j;
Теперь сделайте вид, что вторая и третья строки далеки друг от друга. Если вы просто читаете код, что бы вы ожидали opt = j
? Или более того, почему вы ожидаете, что его поведение будет отличаться от opt = i
?
Чтобы поведение типа обертки отличалось настолько резко, что основано исключительно на его текущем состоянии, было бы очень удивительно.
Кроме того, у нас уже есть способ сообщить, что вы хотите изменить значение внутри optional
. А именно: *opt = j
. Это работает так же, как и для optional<T&>
, как и для optional<T>
.
Путь optional
работает очень просто: это тип оболочки. Как и все существующие в настоящее время типы оберток, операции с ними влияют на оболочку, а не на завернутую. Чтобы повлиять на завершаемую вещь, вы явно используете *
или ->
или какую-либо другую функцию интерфейса.