std::experimental::可选<T>实现:Constexpr 构造函数混淆
std::experimental::optional<T> implementation: Constexpr constructor confusion
在实现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 中。
相关文章:
- constexpr构造函数需要常量成员函数时出现问题
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- C++:初始化 constexpr 构造函数中的成员数组
- 在 constexpr 构造函数中初始化数组是否合法?
- 具有位域的结构的 Constexpr 构造函数
- 类、constexpr 构造函数和 std::string
- 如何在 constexpr 构造函数中初始化矩阵一次?
- 文件中定义的 Constexpr 构造函数.cpp会导致链接错误
- 对外部模板 constexpr 构造函数的未定义引用
- 是否存在与 Eigen::Matrix<>constexpr 构造函数相关的信息?
- 简化冗余std :: array初始化,当时没有constexpr构造函数
- 使用 constexpr 构造函数对结构进行前向声明
- 静态变量的 Constexpr 构造函数会导致动态初始化
- 引用基类的 constexpr 构造函数因编译器而异
- 通过在 constexpr 构造函数中传递 N,在编译时创建一个大小为 N 的数组
- 当编译时参数未知时,不调用"constexpr"构造函数
- GCC 和 Clang 在 constexpr 构造函数上的不同行为
- 具有编译时间验证的ConstexPR构造函数
- std::experimental::可选<T>实现:Constexpr 构造函数混淆
- C++VS2015 constexpr编译错误,constexpr构造函数调用constexpr成员函数