考虑一个类的成员不能直接存储,例如,因为它没有默认构造函数,并且封闭类的构造函数没有足够的信息来创建它:
class Foo
{
public:
Foo(){} // Default ctor
private:
/* Won't build: no default ctor or way to call it's
non-default ctor at Foo's ctor. */
Bar m_bar;
};
显然,m_bar
需要以不同方式存储,例如通过指针。不过, Astd::unique_ptr
似乎更好,因为它会自动破坏它:
std::unique_ptr<Bar> m_bar;
不过,也可以使用std::experimental::optional
:
std::experimenatl::optional<Bar> m_bar;
我的问题是: 1. 权衡是什么?和 2. 构建一个自动选择它们的类是否有意义?
具体来说,查看ctor ofstd::unique_ptr
的异常保证和 ctor of 的异常保证,std::experimental::optional
显然前者必须执行动态分配和释放 - 运行时速度劣势,后者将内容存储在一些(对齐的)内存缓冲区中 -尺寸缺点。这些是唯一的权衡吗?
如果这些确实是权衡,并且鉴于两种类型共享足够的接口(ctor,operator*
),那么使用类似的东西自动选择它们是否有意义
template<typename T>
using indirect_raii = typename std::conditional<
// 20 - arbitrary constant
sizeof(std::experimental::optional<T>) >
20 + sizeof(std::exerimental::optional<T>)sizeof(std::unique_ptr<T>),
std::unique_ptr<T>,
std::experimental::optional<T>>::type;
(注意:有一个问题讨论了这两者作为返回类型之间的权衡,但问题和答案集中在每个传递给函数调用者的内容上,这与这些私有成员无关。)