【问题标题】:How is optional assignment constexpr in C++ 20?C ++ 20中的可选赋值constexpr如何?
【发布时间】:2022-01-19 19:06:17
【问题描述】:

对于可选项的内部内容,可选项不是需要放置新的以重建内部就地存储或联合吗?是否有一些新功能,例如 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)

【问题讨论】:

  • en.cppreference.com/w/cpp/memory/construct_at 不过,我不清楚如何获得 T* 以在 constexpr 上下文中传递。 the proposal 有更多信息。
  • 啊,我认为 T* 来自 constexpr 联合类型。但是,是的,我猜这就是他们用来 constexpr 构造的东西很棒!谢谢。

标签: c++ optional c++20 constexpr


【解决方案1】:

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

对于分配,是的。

但是,虽然我们仍然无法在 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_t(&value, rhs); 
        }
        has_value = true;
        return *this;
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 2020-12-22
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多