作为函数参数的引用和常量引用之间的差异? 这里是C++代码的简单片段: A foo(){ A a; // create a local A object return a; } void bar(const A & a_r){ } bar(foo());

作为函数参数的引用和常量引用之间的差异? 这里是C++代码的简单片段: A foo(){ A a; // create a local A object return a; } void bar(const A & a_r){ } bar(foo());,c++,reference,C++,Reference,为什么函数条的参数必须是常量引用,而不仅仅是引用 Edit1:我知道引用是为了避免复制开销。const是只读的。但是在这里我必须使它成为一个const引用,否则如果我删除“const”,g++将向我抛出一个错误 Edit2:我猜foo()的返回对象是临时对象,不允许更改临时对象的值?如果没有错误消息,我不确定编译器可能会抱怨什么,但我可以从逻辑上解释原因: 行中: bar(foo()); foo()的返回值是临时a;它是通过调用foo()创建的,然后在bar()返回时立即销毁。执行非常量操作

为什么函数条的参数必须是常量引用,而不仅仅是引用

Edit1:我知道引用是为了避免复制开销。const是只读的。但是在这里我必须使它成为一个const引用,否则如果我删除“const”,g++将向我抛出一个错误


Edit2:我猜foo()的返回对象是临时对象,不允许更改临时对象的值?

如果没有错误消息,我不确定编译器可能会抱怨什么,但我可以从逻辑上解释原因:

行中:

bar(foo()); 
foo()的返回值是临时a;它是通过调用foo()创建的,然后在bar()返回时立即销毁。执行非常量操作(即更改临时a的操作)没有意义,因为对象a随后被销毁

再看一看,这是这个问题的一个虚拟副本:


这是一个很好的答案。

引用必须引用
const
对象,因为您无论如何都无法利用对它的更改。比较以下代码段:

void bar(A&);   
A x = foo();
bar(x);
if (x.member) {...} else {...}

在第一个示例中,修改对象的能力可能会显著改变后续代码的执行,而在第二个示例中,我们只是没有方法(可以引用的变量名)来执行。因此,我们只能使用对const的引用,它希望对象不被修改

为什么函数条的参数 必须是常量引用,而不仅仅是 推荐人

bar()的参数不必是常量引用。但当将对象传递给函数参数时,当对象不被函数修改时,这是最有效的方法

  • 将参数设置为常量可确保编译器在尝试修改对象时发出警告
  • 将参数作为引用传递不会创建对象的副本,因此可以实现效率

编译器正在查找
bar(const foo&)
,因为您正在
bar(foo())
中将
对foo的const引用传递到
中的
bar
——这是因为您正在传递对一个临时变量的引用,而该临时变量一旦
bar
返回后将不存在

通过引用在
bar
内部修改
foo
是没有意义的,因为一旦从bar()返回,它就不存在了


所以编译器强制执行此操作以防止隐藏错误,即开发人员将引用传递给临时对象,并更新临时对象,该对象将在方法返回后消失。

代码栏(foo())将左值传递给bar()。只有右值可以有指向它的指针或引用。左值可以有一个常量引用,因为常量限制阻止对不存在的左值进行赋值操作。

函数本身决定其参数是否应为常量。换句话说,您应该提供bar的内容。将返回类a对象的副本,该副本将在使用bar()时可见。谢谢,这实际上是我的猜测:)。所以这只是非法的,因为改变临时对象是没有意义的。WEW——没错,C++标准对更改临时对象感到不满。同样,我链接的问题有一个比我能写的更好的解释。:-)
void bar(A const&);   
bar(foo());
if (//x? we don't have any x! We can't branch here!