在实现std::experimental::optional
(cppreference.com)时,我对一个特定构造函数的规范感到困惑,即:
constexpr optional( const T& value ); // (4)
(来源)
这个构造函数允许在constexpr
上下文中构造optional<T>
,其中T
是一个可平凡销毁的类型。虽然第一个要求,在这种情况下关闭用户提供的析构函数以使optional<T>
成为字面类型,很容易解决,但我不知道如何避开在constexpr中不允许使用placement-new的限制。
我原以为应该使用std::aligned_storage<T>
来实现optional<T>
,以允许不具有默认构造函数并满足任何对齐要求(如果适用)的类型T
。但正如我所说,constexpr
禁止我在那个特定的构造函数中使用placement new。
我喝太多咖啡了,难道没有明显的解决方案吗?
谢谢
union
可能适用于这个特定的构造函数,但我不确定它是否足以处理所有情况。 - user743382T
是平凡可析构时将其替换为赋值。但我不确定是否会遇到包含诸如std::unique_ptr
之类的东西(这将导致类变得平凡可析构),一旦我对包含垃圾的缓冲区进行赋值,它们将尝试删除垃圾指针。 - nshctunion
进行实现;https://llvm.org/svn/llvm-project/libcxx/trunk/include/experimental/optional。gcc libstdc++也是如此;https://gnu.googlesource.com/gcc/+/gcc-5_3_0-release/libstdc++-v3/include/experimental/optional - Niall