Nei*_*l G 19 c++ smart-pointers c++11
我曾经写过这样的代码:
class P {};
class Q: public P {};
class A {
// takes ownership
A(P* p): p_(p) {}
scoped_ptr<P> p_;
};
A a(new Q);
Run Code Online (Sandbox Code Playgroud)
使用C++ 0x,我应该将A类重写为:
class A {
// takes ownership
A(unique_ptr<P>&& p): p_(p) {}
unique_ptr<P> p_;
};
Run Code Online (Sandbox Code Playgroud)
How*_*ant 42
我赞成了comonad的答案,但有一点需要注意:
每当你想明确地 禁止移动语义时,使用a
使用scoped_ptrconst unique_ptr.
我没有遇到任何一个const std::unique_ptr不如a的用例boost::scoped_ptr.但是我对这个问题的教育持开放态度.
编辑:
这是一个用例boost::scoped_ptr,我认为应该失败,但不是.它确实失败了std::unique_ptr:
#include <iostream>
#ifdef USE_UNIQUEPTR
#include <memory>
typedef std::unique_ptr<int> P;
#else // USE_UNIQUEPTR
#include <boost/scoped_ptr.hpp>
typedef boost::scoped_ptr<int> P;
#endif // USE_UNIQUEPTR
int main()
{
P p1(new int(1));
{
// new scope
#ifdef USE_UNIQUEPTR
const P p2(new int(2));
#else // USE_UNIQUEPTR
P p2(new int(2));
#endif // USE_UNIQUEPTR
swap(p1, p2); // should fail!
}
std::cout << *p1 << '\n';
}
Run Code Online (Sandbox Code Playgroud)
如果承诺的boost::scoped_ptr是它的资源不会逃避当前的范围,那么它就不能把这个承诺当作一个const std::unique_ptr.如果我们想将const boost :: scoped_ptr与const :: std :: unique_ptr进行比较,我不得不问:出于什么目的?它们对我来说似乎是一样的,除了const std :: unique_ptr允许自定义构造和销毁.
com*_*nad 30
一个使用scoped_ptr是auto_ptr的 不复制和不动语义.
auto_ptr s总是一个糟糕的选择 - 这很明显.
每当你想明确地具有移动语义,使用的unique_ptr.
每当您想明确禁止移动语义时,请使用scoped_ptr.
所有指针都允许交换语义,例如p.swap(q).要禁止那些,请使用任何const ... _ptr.
在某些情况下,您希望使用指向几个可互换对象之一的scoped_ptr:由于缺少移动语义,因此非常安全(就显而易见的错误而言)它不会意外地指向null移动.值得一提的是:scoped_ptr仍然可以有效地交换掉.要使它可移动和/或可复制 - 但仍然使用这些交换语义 - 您可能需要考虑使用指向指向可交换(通过scoped_ptr :: swap)对象的scoped_ptr的shared_ptr.
有关详细信息,请参阅stackoverflow:smart-pointers-boost-explanation.
| 归档时间: |
|
| 查看次数: |
15783 次 |
| 最近记录: |