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

时间:2016-03-08 06:10:28

标签: c++ optional constexpr placement-new c++17

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

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

Source

这个构造函数允许optional<T>T上下文中构造一个简单的可破坏类型constexpr。虽然第一个要求,即在这种情况下关闭用户提供的析构函数以使optional<T>为文字类型,直接解决,我不知道如何解决 placement-new的限制不被允许进入constexpr

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

我是否需要多喝咖啡,而且我没有看到明显的解决方案?

谢谢

1 个答案:

答案 0 :(得分:4)

  

我不知道如何解决在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
};

Live On Coliru

事实上,optional过去用std::experimental::optional提出的一系列旧提案证明其提出的要求是合理的。 (现在{{1}}存在于各种图书馆基础候选TS中。)