我正在观看视频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;
}
答案 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
返回后,该对象不再存在,并且引用变成了悬空引用。