C++:按值返回并带有引用

C++: Returning by value with a reference

本文关键字:引用 返回 C++      更新时间:2023-10-16

我正在寻求澄清,当返回对象的函数中返回对对象的引用时,究竟会发生什么。

请考虑以下函数:

CObject getObject() {
    CObject localObject;
    CObject &objectRef(localObject);
    return objectRef;
}

我的理解是,这个函数将返回"localObject"的副本,而不是返回对"localObject"的引用。这是对的吗?它本质上是使用 localObject 作为构造函数参数创建和返回一个新对象吗?例如,

CObject newObject(localObject);
它将

返回对象的副本。但是,如果更改函数声明以返回引用,请注意,代码将导致未定义行为。

例:

class CObject{
    public:
    CObject(){std::cout << "cosntructing ";}
    CObject(const CObject& other){std::cout << "copying ";}
};
CObject getObject(){
    CObject localObject;
    CObject &objectRef(localObject);
    return objectRef;
}
int main(){
   auto result =  getObject();
}

这将导致:

余桦 复制

注意:如果您的编译器由于 RVO 而完全优化代码,则可能不会获得相同的结果。因此,请关闭所有优化并尝试。正如@Caduchon所说,即使没有优化,结果也会因复制而改变。


具有未定义行为的函数示例:

CObject& getObject() {
    CObject localObject;
    CObject &objectRef(localObject);
    return objectRef;
}

您是正确的,它没有返回对本地对象的引用。就实际返回的内容而言,答案要微妙一些。由于所谓的返回值优化,编译器实际上只会创建一个CObject实例作为调用函数的结果。这是一个优化技巧,基本上意味着原始localObject的构造方式使调用函数可以直接使用 - 因此在调用返回时不需要复制构造。