class C
{
public:
int True(int i) const
{
return i+2;
}
};
const C& F(const C& c)
{
return c;
}
int main()
{
const C& c = F(C()); // Line 1
cout << boolalpha << c.True(1) << endl; // Line 2
}
问题>为什么上面的代码可以正确打印值?
我假设变量
c
到达第2行时将引用无效的临时C
对象。//更新
我想更新此OP,以说明我对此问题表示关注的原因。
这是C++模板的代码片段:完整指南
// maximum of two values of any type
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
如您所见,函数返回对传递参数的引用。
我只是想知道为什么不使用以下版本:
// maximum of two values of any type
template <typename T>
inline T max (T const& a, T const& b)
{
return a < b ? b : a;
}
最佳答案
通常,当将一个临时对象绑定(bind)到const引用时,该临时对象的生存期将扩展到该引用的生存期。因此,如果您的代码说的是const C& c = C()
,则该临时文件将与c
一样有效。
但是,您要将临时变量传递给另一个函数F()
。在这种情况下,C++ 11规范的第12.2.5节指示临时对象将持续到包含调用的完整表达式完成为止。
因此,当您说const C& c = F(C())
时,临时C()
实际上在此语句的结尾处被破坏,并且在下一行不再有效。
就是说,您的代码似乎可以正常运行,因为在编译时就已知道对c.True()
的调用,并且函数定义实际上并未引用c
中的任何数据,因此,临时对象已死的事实并不会真正影响观察到的行为。但是,这是技术上未定义的行为。