std::experimental::可选<T>实现:Constexpr 构造函数混淆

std::experimental::optional<T> implementation: Constexpr constructor confusion

本文关键字:Constexpr 构造函数 实现 gt experimental lt std 可选      更新时间:2023-10-16

实现std::experimental::optional(cppreference.com)时,我对特定构造函数的规范感到困惑,即:

constexpr optional( const T& value ); // (4)

(来源)

这个构造函数允许optional<T>,对于一个平凡可破坏的类型T,在constexpr上下文中构造。虽然第一个要求,即在这种情况下关闭用户提供的析构函数以使optional<T>文字类型,很容易解决,但我不知道如何绕过 constexpr 中不允许放置 - new 的限制。

我认为我应该使用 std::aligned_storage<T> 实现optional<T>,以允许非默认可构造的类型T并满足任何对齐要求(如果适用)。但正如我所说,constexpr禁止我在该特定构造函数中使用 place new。

我是否喝了很多咖啡,但在这里没有看到明显的解决方案?

谢谢

我不知道如何绕过放置的限制 - 在 constexpr 中不允许放置新。

这是一个正确的诊断,文字类型,constexpr和新表达式不会混合。满足std::experimental::optional<T>各种要求的最直接方法是使用变体成员实现它。简而言之,union必须在某个时候参与其中。快速草图:

template<typename Val>
struct optional {
    union {
        Val optional_value;
        unsigned char dummy_byte;
    };
    bool filled;
    // post-condition: no-value state
    constexpr optional()
        : dummy_byte {}
        , filled(false)
    {}
    // post-condition: has-value state
    constexpr optional(Val const& val)
        : optional_value(val)
        , filled(true)
    {}
    // other special members omitted for brevity
};

住在科里鲁

事实上,旧的optional系列提案曾经有一段关于该技术的段落,以证明它提出的要求是合理的。(如今,std::experimental::optional存在于各种图书馆基础候选 TS 中。