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

And*_*joe 13 c++ constexpr option-type c++20

对于可选的内部内容,可选是否需要放置新的内容才能重建内部就地存储或联合?是否有一些新功能(例如 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)
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 10

对于可选的内部内容,可选是否需要放置新的内容才能重建内部就地存储或联合?

对于作业来说,是的。

但是,虽然我们仍然无法在 constexpr 时间内进行实际的新放置,但我们确实找到了解决方法:(std::construct_at来自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;
    }
};
Run Code Online (Sandbox Code Playgroud)