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

标签 c++ option-type constexpr placement-new c++17

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

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

( Source )

这个构造函数允许optional<T> , 对于一个普通的可破坏类型 T , 将于 constexpr build 语境。而第一个要求,即在这种情况下关闭用户提供的析构函数以生​​成 optional<T>。文字类型,可以直接解决,我不知道如何解决 constexpr 中不允许放置新内容 的限制。

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

我是不是喝了太多咖啡,却没有看到明显的解决方案?

谢谢

最佳答案

I do not know how to get around the limitation of placement-new not being allowed in 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建议用于have a paragraph on the technique以证明它提出的要求是完全合理的。 (现在 std::experimental::optional 存在于各种图书馆基础候选人 TS 中。)

关于c++ - std::experimental::optional<T> 实现:Constexpr 构造函数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860241/

相关文章:

c++ - 静态内存中数组的大小可以在 C++ 运行时更改吗?怎么来的?

与枚举和可选元组关联值的 Swift 模式匹配

c++ - 替换常量 : when to use static constexpr and inline constexpr?

c++ - 从 constexpr 数组获取 constexpr 属性时遇到困难

c++ - 迭代多个嵌套 vector

c++函数,查找传入的n个数字的平均值,总和,最小值和最大值

c++ - friend 类声明

swift - 检查可选 boolean 值

c++ - 使用 boost::optional 捕获和包装异常

c++ - 如果基类包含数组成员,则派生类的构造函数不能是 constexpr