在 C++11 中std::shared_ptr
有四个构造函数,可以传递删除器对象d
类型的D
。这些构造函数的签名如下:
template<class Y, class D> shared_ptr(Y * p, D d);
template<class Y, class D, class A> shared_ptr(Y * p, D d, A a);
template <class D> shared_ptr(nullptr_t p, D d);
template <class D, class A> shared_ptr(nullptr_t p, D d, A a);
该标准要求在[util.smartptr.shared.const] http://eel.is/c++draft/util.smartptr.shared.const#7 type D
可复制构造。为什么需要这个?如果shared_ptr
复印d
那么这些删除器中的哪一个可能会被调用呢?难道不可能吗shared_ptr
只保留一个删除器?这对一个人来说意味着什么shared_ptr
to own删除器如果d
可以复制吗?
CopyConstructible 要求背后的基本原理是什么?
PS:这个要求可能会使编写删除器变得复杂shared_ptr
. unique_ptr
似乎对其删除器有更好的要求。
这个问题太令人困惑了,我给彼得·迪莫夫(Peter Dimov)(boost::shared_ptr
并参与标准化std::shared_ptr
)
以下是他所说的要点(经他许可转载):
我的猜测是,Deleter 必须是可复制构造的,实际上只是作为一个
C++03 的遗物,其中不存在移动语义。
你的猜测是正确的。什么时候shared_ptr
被指定为右值引用
还不存在。如今我们应该能够满足要求
不可抛出移动构造。
有一个微妙之处,当
pi_ = new sp_counted_impl_pd<P, D>(p, d);
throws, d
必须保持完整以进行清理d(p)
去工作,但是我
认为这不会是一个问题(虽然我实际上还没有
试图使实施移动友好)。
[...]
我认为对于
实现来定义它,以便当new
投掷,d
将被留下
处于原始状态。
如果我们更进一步并允许D
要有一个投掷移动构造函数,事情就得到了
更复杂。但我们不会。 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)