jot*_*tik 37 c++ shared-ptr language-lawyer c++11
在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);
Run Code Online (Sandbox Code Playgroud)
[util.smartptr.shared.const]类型中的标准要求D为CopyConstructible.为什么需要这个?如果shared_ptr制作d那些删除者中的哪一个可能被调用的副本?是不是shared_ptr只能保留一个删除器?如果可以复制shared_ptr,拥有删除器意味着什么d?
CopyConstructible要求背后的理由是什么?
PS:这个要求可能会使写作删除者复杂化shared_ptr.unique_ptr似乎对其删除有更好的要求.
And*_*dyG 21
这个问题很令人困惑,我通过电子邮件发送了Peter Dimov(实施者boost::shared_ptr并参与了标准化工作std::shared_ptr)
这是他所说的要点(经他许可转载):
我的猜测是,Deleter必须是CopyConstructible,它真的只是作为C++ 03的遗物,其中移动语义不存在.
你的猜测是正确的.何时
shared_ptr指定rvalue引用尚不存在.如今,我们应该能够满足而不是要求可移动构造.当时有一个微妙之处
Run Code Online (Sandbox Code Playgroud)pi_ = new sp_counted_impl_pd<P, D>(p, d);投掷,
d必须保持完整,以便清理d(p)工作,但我认为这不会是一个问题(虽然我实际上并没有尝试使实现移动友好).
[...]
我认为实现定义它没有问题,这样当new抛出时,d将保持原始状态.如果我们进一步允许
D有一个投掷移动构造函数,事情会变得更复杂.但我们不会.:-)
| 归档时间: |
|
| 查看次数: |
856 次 |
| 最近记录: |