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

Bel*_*loc 2 c++ auto-ptr pass-by-reference

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

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

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

ild*_*arn 5

总结评论:

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

"危险性较小"是指复制构造函数(现在采用非const引用)可以完全转移所有权; 这仍然是危险的,只是没有复制构造函数采用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库现在提供了一个C++ 03仿真std::unique_ptr<>,应该使用它而不是boost::scoped_ptr<>:boost::movelib::unique_ptr<>.