C++ C++;:通过引用返回值

C++ C++;:通过引用返回值,c++,C++,我正在寻求澄清,当一个人在返回类型为某个对象的函数中返回对该对象的引用时,会发生什么 考虑以下功能: CObject getObject() { CObject localObject; CObject &objectRef(localObject); return objectRef; } 我的理解是,此函数将返回“localObject”的副本,而不是返回对“localObject”的引用。这是正确的吗?它本质上是创建并返回一个以localObject作为构

我正在寻求澄清,当一个人在返回类型为某个对象的函数中返回对该对象的引用时,会发生什么

考虑以下功能:

CObject getObject() {
    CObject localObject;
    CObject &objectRef(localObject);
    return objectRef;
}
我的理解是,此函数将返回“localObject”的副本,而不是返回对“localObject”的引用。这是正确的吗?它本质上是创建并返回一个以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();
}

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

您在堆栈上执行此操作……如果需要堆,请在堆上执行而不是在堆中执行,而不仅仅是为了使此示例成为工作注释如果将结果分配给新变量,则可以省略副本。编译器可以看到它并直接从函数中构造变量。@Caduchon你比我快:)它已被编辑。谢谢你提到我明白了。因此,只要返回类型是by value,它就会始终构造通过引用提供的对象的副本。谢谢你的详尽回答!我使用GCC4.8.3。请参见使用
g++copy.cpp-o copy-O0
@buratino编译的示例()。您的代码具有未定义的行为。任何事情都可能发生,包括炸毁运行它的电脑。你不能以合乎逻辑的方式对待UB
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();
}
CObject& getObject() {
    CObject localObject;
    CObject &objectRef(localObject);
    return objectRef;
}