




Причина заключалась в том, что [expr.const] ранее запретил:
an assignment expression or invocation of an assignment operator ([class.copy]) that would change the active member of a union;
Это ограничение больше не существует из-за P1330: изменение активного члена союза внутри constexpr, что значительно упрощает реализацию всех этих вещей (в документе буквально просто удаляется пункт маркера, который я цитировал выше).
Причина, по которой назначение копирования и перемещения optional (но ни одно из других назначений) было constexpr, заключалась в том, что их можно просто использовать по умолчанию для тривиальных типов.
Есть ли документ, чтобы сделать функции optionals constexpr теперь, когда у нас есть P1330?
@ Rakete1111 Не то, чтобы я в курсе - хотите это написать?
Последующие действия: с этим можно полностью реализовать constexprstd::optional, верно? И почему стандартная реализация в первую очередь использует union (например, в пользу std::aligned_storage или только необработанных байтов)?
@ m8mble Да. И не может использовать какой-либо reinterpret_cast в constexpr.
@ Rakete1111 Хорошо, теперь есть.
Мы не заслуживаем тебя, Барри. Ты удивительный :)
Если бы это было так, никакой оператор присваивания не мог быть помечен как constexpr.
std::optionalимеет несколько таких операторов присваивания.