C++ returns objects 按值

C++ returns objects by value

主题几乎在问题的标题中。我在 Meyrses 的书中看到了这个 "Effective C++":

the fact that C++ returns objects by value

这是什么意思,C++ 标准如何支持该消息?例如,假设我们有这样的东西:

int foo()
{
    int a = 1;
    return a;
}

很清楚,这句话意味着我们 returns 存储在局部变量中的值的副本。但考虑一下:

int& foo()
{
    int a = 1;
    return a;
}

编译器应该警告我们返回对局部变量的引用。 "returning by value fact" 如何应用于该示例?

Meyers 大体上是正确的,尽管在处理参考文献时您必须对措辞持保留态度。在某种抽象层次上,这里你传递的是引用本身 "by value".

但他真正想说的是,除此之外,C++ 默认按值传递,这与 Java 等语言形成对比,在这些语言中,对象总是使用引用语义来代替。

事实上,有人 可以 争辩说该段落根本不适用于您的代码,因为引用不是 "object"。

Return by reference 会给你一个错误,因为你将变量的引用传递给另一个函数(调用函数 foo 的函数),这超出了局部变量(变量 a)的范围。

当书上说 "C++ returns objects by value" 时,它解释了当您使用 "plain" class 名称作为 return 类型而不附加 "decorations" 时会发生什么,例如&符号或星号,例如

struct MyType {
    ... // Some members go here
};
MyType foo() {
    ...
}

在上面的示例中 foo() return 一个对象的值。

这句话不应暗示 C++ 缺少从函数中 return 获取数据的其他方法:因为您可以轻松构造一个 return 作为引用或指针的函数。

请注意,仅当您 return 指针或对本地对象的引用时,通过指针或引用 return 对象才会产生未定义的行为。访问超过其生命周期的对象总是会导致未定义的行为。通过引用或指针返回局部变量可能是导致此未定义行为的最常见错误。