这个话题几乎就是问题的标题。我在Meyrses的书中看到了这一点" Effective C ++":
C ++按值返回对象的事实
这意味着什么以及C ++标准如何支持该消息?对于实例,请说我们有这样的事情:
int foo()
{
int a = 1;
return a;
}
非常清楚,这句话意味着我们返回存储在局部变量中的值的副本。但请考虑一下:
int& foo()
{
int a = 1;
return a;
}
编译器应警告我们返回对局部变量的引用。这是怎样的"以价值事实回归"适用于那个例子?
答案 0 :(得分:6)
Meyers在主要方面是正确的,但在处理参考文献时你必须用一点点盐来处理这个措辞。在一定程度的抽象中,你在这里传递引用本身"按值"。
但他真正想说的是,除此之外,C ++默认情况下会传递值,这与Java等语言形成对比,在Java中,对象总是被引用语法所取代。
事实上,一个可以认为该段落根本不适用于您的代码,因为该引用不是"对象"。
答案 1 :(得分:2)
当书中说" C ++按值返回对象"时,它解释了当你使用" plain" class name作为返回类型,没有附加"装饰",例如&符号或星号,例如。
struct MyType {
... // Some members go here
};
MyType foo() {
...
}
在上面的示例中,foo()
按值返回对象。
这句话不应该暗示C ++缺少从函数返回数据的其他方法:因为你可以很容易地构造一个返回引用或指针的函数。
请注意,只有在返回指针或对本地对象的引用时,通过指针或引用返回对象才会创建未定义的行为。在其生命周期内访问对象总是会导致未定义的行为。通过引用或指针返回本地可能是导致此未定义行为的最常见错误。
答案 2 :(得分:0)
通过引用返回会给你一个错误,因为你正在将一个变量的引用传递给另一个函数(调用函数foo的函数),这个函数超出了局部变量(变量a)的范围。