constexpr std:: необязательный сброс

Я просматривал интерфейс шаблона класса C++-17 std::optional и заметил, что reset< /a> и assignment из nullopt не помечены как constexpr.

Было ли это недосмотром или есть причина, по которой эта операция не может быть помечена как constexpr?


person apmccartney    schedule 20.12.2018    source источник
comment
Если бы это было правдой, ни один оператор присваивания не мог бы быть помечен как constexpr. std::optional имеет несколько таких операторов присваивания.   -  person apmccartney    schedule 21.12.2018


Ответы (1)


Была причина, которая заключалась в том, что [expr.const] ранее запрещал:

выражение присваивания или вызов оператора присваивания ([class.copy]), который изменяет активный член объединения;

Это ограничение больше не существует в результате P1330: изменение активного члена объединения внутри constexpr, что делает все эти вещи намного проще реализовать (документ буквально просто удаляет пункт списка, который я цитировал выше).

Причина, по которой назначение копирования и перемещения optional (но ни одно из других назначений) не было constexpr, заключалась в том, что их можно просто использовать по умолчанию для тривиальных типов.

person Barry    schedule 20.12.2018
comment
Есть ли документ, чтобы сделать функции optionals constexpr теперь, когда у нас есть P1330? - person Rakete1111; 21.12.2018
comment
@ Rakete1111 Rakete1111 Не то, чтобы я в курсе - хочешь написать? - person Barry; 28.12.2018
comment
Дополнения: при этом можно реализовать полностью constexpr std::optional, верно? И почему в стандартной реализации в первую очередь используется union (например, вместо std::aligned_storage или просто необработанных байтов)? - person m8mble; 12.12.2020
comment
@ m8mble Да. И нельзя использовать какие-либо reinterpret_cast в constexpr. - person Barry; 12.12.2020
comment
@ Rakete1111 Хорошо, теперь есть. - person Barry; 12.12.2020
comment
Мы не заслуживаем тебя, Барри. Ты удивительный :) - person apmccartney; 13.12.2020