2

Nicolai Josuttis 在他的《C++ 标准库 - 教程和参考》一书中,在第 44 页写了以下段落:

根据 auto_ptrs 的概念,可以通过使用常量引用将所有权转移到函数中。这是非常危险的,因为人们通常期望当您将对象作为常量引用传递时,它不会被修改。幸运的是,有一个较晚的设计决定使 auto_ptrs 的危险性降低。通过一些棘手的实现技术,使用常量引用是不可能转移所有权的。事实上,你不能改变任何常量 auto_ptr 的所有权:……

如果不可能通过常量引用来更改所有权,为什么上面的“这很危险”和“不太危险”这样的表达方式?

4

1 回答 1

5

总结评论:

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

“不那么危险”是指复制构造函数(现在采用非常量引用)可以完全转移所有权。这仍然很危险,只是不像复制构造函数采用 const 引用那样危险。

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


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

于 2012-02-21T17:17:29.647 回答