std::experimental::optional<T>实现:Constexpr构造函数混淆
std::experimental::optional<T> implementation: Constexpr constructor confusion
虽然 实现 std::experimental::optional
(cppreference.com) 我对特定构造函数的规范感到困惑,即:
constexpr optional( const T& value ); // (4)
(Source)
此构造函数允许 optional<T>
在 constexpr
上下文中构造可平凡破坏的类型 T
。虽然第一个要求,即在这种情况下关闭用户提供的析构函数以使 optional<T>
成为文字类型,可以直接解决,但我不知道如何绕过 placement 的限制-constexpr.
中不允许新建
我认为我应该使用 std::aligned_storage<T>
来实现 optional<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
};
事实上,旧系列的 optional
提案曾经 have a paragraph on the technique 证明它提出的要求是完全合理的。 (如今 std::experimental::optional
继续存在于各种图书馆基础知识候选人 TS 中。)
虽然 实现 std::experimental::optional
(cppreference.com) 我对特定构造函数的规范感到困惑,即:
constexpr optional( const T& value ); // (4)
(Source)
此构造函数允许 optional<T>
在 constexpr
上下文中构造可平凡破坏的类型 T
。虽然第一个要求,即在这种情况下关闭用户提供的析构函数以使 optional<T>
成为文字类型,可以直接解决,但我不知道如何绕过 placement 的限制-constexpr.
我认为我应该使用 std::aligned_storage<T>
来实现 optional<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
};
事实上,旧系列的 optional
提案曾经 have a paragraph on the technique 证明它提出的要求是完全合理的。 (如今 std::experimental::optional
继续存在于各种图书馆基础知识候选人 TS 中。)