Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将auto_ptr传递给期望对auto_ptr进行常量引用的函数有什么危险? Nicolai Josuttis,在他的《C++标准库》一书的教程和参考文献中,在第44页中写道:_C++_Pass By Reference_Auto Ptr - Fatal编程技术网

将auto_ptr传递给期望对auto_ptr进行常量引用的函数有什么危险? Nicolai Josuttis,在他的《C++标准库》一书的教程和参考文献中,在第44页中写道:

将auto_ptr传递给期望对auto_ptr进行常量引用的函数有什么危险? Nicolai Josuttis,在他的《C++标准库》一书的教程和参考文献中,在第44页中写道:,c++,pass-by-reference,auto-ptr,C++,Pass By Reference,Auto Ptr,根据auto_ptrs的概念,可以通过使用常量引用将所有权转移到函数中。这是非常危险的,因为当您将对象作为常量引用传递时,人们通常期望对象不会被修改。幸运的是,后来的设计决策降低了汽车的危险性。通过一些棘手的实现技术,所有权的转移在不断引用的情况下是不可能的。事实上,您不能更改任何常量auto_ptr的所有权: 如果无法通过一个固定的引用来改变所有权,为什么上面的表达“这是非常危险的”和“不太危险的”?总结评论: 当std::auto_ptr的复制构造函数(用于传输所有权)使用const引用参数

根据auto_ptrs的概念,可以通过使用常量引用将所有权转移到函数中。这是非常危险的,因为当您将对象作为常量引用传递时,人们通常期望对象不会被修改。幸运的是,后来的设计决策降低了汽车的危险性。通过一些棘手的实现技术,所有权的转移在不断引用的情况下是不可能的。事实上,您不能更改任何常量auto_ptr的所有权:

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

总结评论:

当std::auto_ptr的复制构造函数(用于传输所有权)使用const引用参数时,这是非常危险的——这完全违反了

不那么危险是指现在采用非常量引用的复制构造函数可以转移所有权;这仍然很危险,只是不像复制构造函数接受常量引用那样危险

std::auto_ptr的这一方面被普遍认为是类中的一个缺陷,以至于它通常被认为是无法修复的。因此,和在很大程度上被认为是C++03中真正的智能指针,而在C++11中,std::auto_ptr被完全弃用,而在C++17中被完全删除


更新:从Boost 1.57开始,该库现在提供了一个std::unique_ptr的C++03仿真,应该使用它,而不是Boost::scoped_ptr:。

在他们无法使用常量引用更改所有权之前,他描述了这个场景。@ildjarn但幸运的是,这句话怎么说,后来的设计决定降低了汽车的危险性。是的,他们不可能通过const reference更改所有权-你是在问为什么这样会降低危险性?我的母语不是英语。但我想在这种情况下没有什么危险。那么为什么表达式不那么危险呢?接受非常量引用的复制构造函数可以转移所有权这一事实仍然是危险的,只是不像复制构造函数接受常量引用那样危险。这就是为什么std::auto_ptr多年来一直受到反对,boost::scoped_ptr和boost::shared_ptr占据了C++03智能指针的主导地位,现在在C++11中正式反对std::unique_ptr。std::auto_ptr的这一方面被普遍认为是类中的一个缺陷:我不同意。只要你知道自己在做什么就好。如果没有移动语义,就不可能从函数返回非引用计数的智能指针。std::auto_ptr解决了这个问题。是的,这样做打破了复制的概念,但这是语言提供的,所以这是唯一的选择。如果您已经访问了unique_ptr,那么显然您应该放弃auto_ptr。但只要你知道它的行为,它就完全可用。@Nicol:它的语义不明显,与标准库的其他部分相反,这不是一个缺陷?;-]在我的书中,容易出错的特朗普是可用的-很难搞错std::shared_ptr或std::unique_ptr的用法,但很容易搞错std::auto_ptr的用法。将auto_ptr视为唯一的_ptr对我有效,否则我会尽量避免。auto_ptr的这一方面通常被认为是积极的方面,并且是使用auto_ptr的主要动机。它已被转至unique_ptr。auto_ptr被弃用的原因很简单,因为它太复杂,而且过于指定;对于普通用户,unique_ptr在所有方面都会替换它。@James:您可以将其移动到另一个对象,但这些语义是显而易见的,因为它们通常是显式的,即您看到的std::move。