返回对临时对象的引用

时间:2018-10-04 16:43:16

标签: c++

我正在观看视频Curiously Recurring C++ Bugs at Facebook 在代码的14:58处(请参见我在此处给出的示例),他说这是毫无希望的。原因是返回对临时对象的引用不起作用。

那为什么行得通呢?

#include <iostream>
#include <map>
using namespace std;

const string& get_default(
        const map<string,string>& map,
        const string& key,
        const string& dflt) {

    auto pos = map.find(key);
    return (pos != map.end() ?
                pos->second : dflt);
}

int main()
{
    map<string,string> m;

    auto& value = get_default(m,"whatever","this is the default value");
    cout << value << endl;

    return 0;
}

我理解为什么我不能返回对局部变量的引用(当我尝试打印局部变量时会失败),但是我不能使此代码失败,而且我也不知道为什么。 我检查了google,发现如果将临时对象分配给引用,则将延长临时对象的生存期(这就是为什么它起作用的原因?)。 如果是这样,为什么这段代码如此绝望地破了?

使用:gcc 7.3.0,c ++ 14

现在使用注释,我可以看到如何使其失败: 谢谢大家:)

 int main()
    {
        map<string,string> m;

        auto& value = get_default(m,"whatever","this is the default value"); // const string& value = fails the same way

        string a = "some long string";

        cout << value << endl;//"some long string" will be printed here (this is how it fails - and shows that it is a mess)

        return 0;
    }

1 个答案:

答案 0 :(得分:1)

仅在某些情况下会延长临时对象的寿命。发布的代码中的示例不是这些上下文之一。

int foo() { return 10; }

...

int const& x = foo(); // Life of the temporary is extended.

但是,

const int& foo() { return 10; } // Life of the temporary is not extended.

...


int const& x = foo();           // Dangling reference.

您发布的代码类似于

const int& foo(int const& in) { return in; }

...


int const& x = foo(10);

此处,引用仅在foo内部有效。 foo返回后,该对象不再存在,并且引用变成了悬空引用。