如何声明一个存储引用返回的对象的变量?

cls*_*udt 3 c++ return reference return-type

C++引用仍然让我感到困惑.假设我有一个函数/方法,它创建一个类型的对象Foo并通过引用返回它.(我假设如果我想返回对象,它不能是在堆栈上分配的局部变量,所以我必须在堆上分配它new):

Foo& makeFoo() {
    ...
    Foo* f = new Foo;
    ...
    return *f;
}
Run Code Online (Sandbox Code Playgroud)

当我想存储在另一个函数的局部变量中创建的对象时,该类型应该是 Foo

void useFoo() {

    Foo f = makeFoo();
    f.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

还是Foo&

void useFoo() {

    Foo& f = makeFoo();
    f.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

由于两者都是正确的语法:两个变体之间是否存在显着差异?

Luc*_*ore 5

是的,第一个将复制返回的引用,而第二个将引用返回的引用makeFoo.

请注意,使用第一个版本将导致内存泄漏(最有可能),除非您在复制构造函数中做了一些黑暗魔法.

好吧,除非你打电话,否则第二个也会导致泄漏delete &f;.

底线:不要.只需跟随人群并按价值返回.或智能指针.