gpt4 book ai didi

c++ - std::move 与 std::auto_ptr 相比?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:45 24 4
gpt4 key购买 nike

我可以用 C++11 中的“移动”(右值引用)做什么我不能用 std::auto_ptr 做什么? (据我了解,它们是一个想法的不同实现。)

老问题又来了:std::auto_ptr 是这么糟糕的组件吗?

最佳答案

C++98/03 没有真正“可移动”类的概念。 auto_ptr 是一个具有 transfer-on-copy-semantics 的类,即当您制作拷贝时,原始内容会发生变化(注意带有非常量参数的复制构造函数!)。这是不好的。这样的类不能在标准容器中使用。

由于新添加的右值引用概念,C++11 引入了真正可移动类的概念。新的 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 ;-)

关于c++ - std::move 与 std::auto_ptr 相比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8465516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com