Iak*_*kin 5 c++ std auto-ptr rvalue-reference c++11
我可以用C++ 11中的'move'(r值引用)做些什么我不能用std::auto_ptr?(据我所知,他们是一个想法的不同实现.)
再问一个旧问题:std::auto_ptr组件是如此糟糕?
Ker*_* SB 16
C++ 98/03没有真正"可移动"类的概念.auto_ptr是一个具有复制转移语义的类,即当你复制时,原始内容发生了变化(请注意带有非const参数的复制构造函数!).这是不好的.这样的类不能用在标准容器中.
C++ 11引入了真正可移动类的概念,这要归功于新增的rvalue引用概念.新的unique_ptr,auto_ptr完全取代,根本不再可复制,但它是可移动的.如果可能,所有标准容器都已更新以尝试移动对象,因此现在可以在标准容器中存储仅移动对象.仅可移动但不可复制的对象的其他示例是互斥锁,锁,线程和iostream.
为了说明问题,请将假设的,破碎的C++ 98代码与相应的C++ 11代码进行比较:
std::auto_ptr<Foo> p1(new Foo);
std::vector< std::auto_ptr<Foo> > v1;
//v1.push_back(p1); // eeww, what is the state of p1 now? ERROR
std::unique_ptr<Foo> p2(new Foo);
std::vector<std::unique_ptr<Foo>> v2;
//v2.push_back(p2); // Error, copying is simply not allowed
v2.push_back(std::move(p2)); // explicit; mustn't read p2 after moving it
v2.emplace_back(new Foo); // even better ;-)
Run Code Online (Sandbox Code Playgroud)
问题std::auto_ptr在于它具有与移动操作类似的复制操作.因此,与复制操作一起使用的算法可以工作auto_ptr,但它们不会按预期运行,因为从对象复制的更改.因此auto_ptr不能与STL容器一起使用,但尝试这样做的代码将编译,但无法在运行时工作.
std::unique_ptr另一方面,没有复制操作,但只能移动.因此,复制的算法std::unique_ptr在操作时将无法编译std::unique_ptr.如果某些东西使用移动操作,它不会期望移动操作的源保持不变,因此没有混淆.
所以基本上它归结为C++对象(或不是)所期望的操作.
| 归档时间: |
|
| 查看次数: |
1172 次 |
| 最近记录: |