作为函数参数的引用和常量引用之间的差异? 这里是C++代码的简单片段: A foo(){ A a; // create a local A object return a; } void bar(const A & a_r){ } bar(foo());
为什么函数条的参数必须是常量引用,而不仅仅是引用 Edit1:我知道引用是为了避免复制开销。const是只读的。但是在这里我必须使它成为一个const引用,否则如果我删除“const”,g++将向我抛出一个错误作为函数参数的引用和常量引用之间的差异? 这里是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()返回时立即销毁。执行非常量操作
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!