将auto_ptr传递给期望对auto_ptr的常量引用的函数有什么危险?

时间:2012-02-21 16:57:45

标签: c++ pass-by-reference auto-ptr

Nicolai Josuttis在他的书“The C ++ Standard Library - A Tutorial and Reference”中,在第44页写下了以下段落:

  

根据auto_ptrs的概念,可以通过使用常量引用将所有权转移到函数中。这是非常危险的,因为人们通常期望在将对象作为常量引用传递时不会修改对象。幸运的是,有一个迟到的设计决定使auto_ptrs不那么危险。通过一些棘手的实现技术,通过常量引用无法转移所有权。实际上,您无法更改任何常量auto_ptr的所有权:...

如果无法通过常量引用更改所有权,为什么上面的表达“这是非常危险的”和“不太危险”?

1 个答案:

答案 0 :(得分:5)

总结评论:

“这非常危险”指的是当std::auto_ptr<>的复制构造函数(转移所有权)采用const引用参数时 - 这完全违反了const-correctness

“Less dangerous”指的是复制构造函数(现在采用非const引用)可以完全转移所有权;这仍然是危险的,只是 as 危险,就像拷贝构造函数采用const引用一样。

std::auto_ptr<>的这一方面被普遍认为是班级中的一个缺陷,因为它通常被认为是无法破解的。因此, boost::scoped_ptr<> boost::shared_ptr<>在很大程度上被认为是C ++ 03的“真正”智能指针,在C ++ 11中std::auto_ptr<>完全被弃用了赞成std::unique_ptr<>(并完全在C ++ 17中删除)。


更新:从Boost 1.57开始,Boost.Move库现在提供std::unique_ptr<>的C ++ 03仿真,应该使用而不是boost::scoped_ptr<>boost::movelib::unique_ptr<>