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

nsh*_*hct 5 c++ placement-new optional constexpr c++17

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

constexpr optional( const T& value ); // (4)
Run Code Online (Sandbox Code Playgroud)

(来源)

optional<T>对于易于破坏的类型T,该构造函数允许在constexpr上下文中构造.虽然第一个要求,即在这种情况下关闭用户提供的析构函数来制作optional<T>文字类型,直接解决,我不知道如何绕过constexpr中不允许放置限制.

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

我喝咖啡多少,而且我没有看到明显的解决方案吗?

谢谢

Luc*_*ton 5

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

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

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
};
Run Code Online (Sandbox Code Playgroud)

Live On Coliru

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