C++ 20 中的可选赋值 constexpr 如何?

How is optional assignment constexpr in C++ 20?

对于optional的内部内容,optional不需要placement new来重构内部的in place storage或union吗?是否有一些新功能,如 C++ 20 中的 placement new 允许 std::optional 的 constexpr 赋值?

template< class U = T >
optional& operator=( U&& value );
(since C++17)
(until C++20)
template< class U = T >
constexpr optional& operator=( U&& value );
(since C++20)

To the internal content of an optional, doesn't the optional require placement new in order to reconstruct the internal in place storage or union?

对于作业,是的。

但是虽然我们仍然无法在 constexpr 时间内执行 actual placement new,但我们确实找到了一个解决方法来解决它的缺失:std::construct_at (from P0784)。这是一种非常有限的新安置形式,但足以让 optional 分配工作。

另一个变化是我们还需要能够实际更改联合的活动成员 - 因为如果我们不能实际切换,是否可以构造新对象并不重要。这也发生在 C++20 中 (P1330)。

将它们放在一起,您将获得可选赋值的功能实现:P2231。简化的实现如下所示:

template <typename T>
struct optional {
    union {
        T value;
        char empty;
    };
    bool has_value;

    constexpr optional& operator=(T const& rhs) {
        if (has_value) {
            value = rhs;
        } else {
            // basically ::new (&value) T(rhs);
            // except blessed for constexpr usage
            std::construct_at(&value, rhs); 
        }
        has_value = true;
        return *this;
    }
};