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 C& c = C()
,那么临时文件将与 c
一样长。
但是,您将临时值传递给另一个函数 F()
。在这种情况下,C++11 规范的 §12.2.5 规定临时变量将持续到包含调用的完整表达式完成。
因此,当您说 const C& c = F(C())
时,临时 C()
实际上在此语句的末尾被破坏,并且在下一行不再有效。
也就是说,您的代码似乎运行正常,因为对 c.True()
的调用在编译时是已知的,并且函数定义实际上并未引用 c
中的任何数据,因此临时文件已死的事实并不会真正影响观察到的行为。然而,这在技术上是未定义的行为。
关于c++ - 临时对象销毁后为什么不崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59376783/