关于将临时对象传递给常量引用 在安德鲁·克尼格的《加速C++》中,他展示了以下代码: vector<double> emptyvec() { vector<double> v; // no elements return v; } grade(midterm, final, emptyvec()); vector emptyvec() { 向量v;//没有元素 返回v; } 成绩(期中、期末、emptyvec());

关于将临时对象传递给常量引用 在安德鲁·克尼格的《加速C++》中,他展示了以下代码: vector<double> emptyvec() { vector<double> v; // no elements return v; } grade(midterm, final, emptyvec()); vector emptyvec() { 向量v;//没有元素 返回v; } 成绩(期中、期末、emptyvec());,c++,reference,C++,Reference,现在,grade函数对向量进行常量引用。这对我来说意味着应该复制emptyvec()返回的临时对象,因为它在堆栈中创建为局部变量和别名,这对我来说很奇怪。这到底是怎么回事?同样在另一页上,他将一个const引用传递给一个函数,该函数按值获取其参数并修改它们。vector的常量引用是否可以传递给其参数需要vector的函数 这意味着应该复制由emptyvec()返回的临时对象,因为它是作为局部变量在堆栈中创建的 当然,它确实被复制了。但是,它被复制到的位置是由编译器指定的,而不是由程序指定的 如果

现在,grade函数对向量进行常量引用。这对我来说意味着应该复制emptyvec()返回的临时对象,因为它在堆栈中创建为局部变量和别名,这对我来说很奇怪。这到底是怎么回事?同样在另一页上,他将一个const引用传递给一个函数,该函数按值获取其参数并修改它们。
vector
的常量引用是否可以传递给其参数需要
vector
的函数

这意味着应该复制由
emptyvec()
返回的临时对象,因为它是作为局部变量在堆栈中创建的

当然,它确实被复制了。但是,它被复制到的位置是由编译器指定的,而不是由程序指定的

如果不是因为编译器能够为常量引用传递临时引用,您将被迫执行以下操作:

vector<double> tmp(emptyvec());
grade(midterm, final, tmp);
向量tmp(emptyvec()); 成绩(期中、期末、tmp); 这几乎就是书中代码的幕后所发生的事情,只是代码没有可访问的
tmp
变量

vector
的常量引用是否可以传递给其参数需要
vector
的函数

可以,只要参数是通过值传递的,而不是通过引用传递的。回想一下,复制构造函数接受一个
const
引用。调用一个函数,使用<代码> vector < /C> >并通过<代码> const vector和< /c> >,C++调用一个构造器,用于<代码> vector < /C> >,传递一个常数引用,并在函数内使用结果拷贝。< /p> 现在,grade函数对向量进行常量引用。对我来说,这意味着应该复制由emptyvec()返回的临时对象

grade
接受常量引用这一事实并不影响
emptyvec
返回的对象是否被复制

这到底是怎么回事

如果按值返回局部变量,则在概念上复制(或从C++11开始移动)局部变量

但是,C++标准允许复制(和移动)被“规避”。在实践中,优化器可以选择将返回的对象构建在它将被复制到的位置。这称为“(命名)返回值优化”

同样在另一页上,他将一个const引用传递给一个函数,该函数按值获取其参数并修改它们。向量的常量引用是否可以传递给其参数需要向量的函数


使用相同类型的(const)引用初始化对象将调用复制构造函数。函数的参数将是所引用对象的副本。

什么使您认为应该复制通过引用传递的向量?(你的第二个问题应该是第二个问题,带有适当的代码示例。)实际上,我有点困惑。该向量可能是由向量构造函数在堆中初始化的,对吗?通过按值而不是按引用返回它,毕竟
emptyvec
返回的是一个向量而不是一个引用,v的值应该复制到grade的参数中,这就是我的看法。你说“grade函数需要一个常量引用”,但在你的最后一句话中你说“其参数需要向量的函数”第二个问题是关于另一个函数,它需要一个
向量
,并向它传递一个
常量向量&
。@meguli函数定义它接收的参数。这对可以传递的内容施加了限制,但不是一对一的。在我看来,你在试图学习什么是允许的“规则体系”。但更有用的是理解代码的含义。例如,采用
向量
意味着(除类型外)可以在函数中修改对象,但这些修改不得影响源。第二点很重要,因为保证条件的唯一方法是复制。由于您可以从它的引用中复制某些内容,因此这非常适合
常量&
。如果函数接受`const vector&`并向它传递一个
向量
,该怎么办?我们仍然调用复制构造函数吗?@meguli如果函数采用const引用,则在调用过程中将不会调用复制构造函数。