c – 为什么在临时对象被销毁后不会崩溃

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; 
} 
最佳答案
通常,当临时绑定到const引用时,临时的生命周期会延长到引用的生命周期.因此,如果你的代码说const C& c = C()然后临时只要c就可以存活.

但是,您将临时文件传递给另一个函数F().在这种情况下,C 11规范的§12.2.5规定临时将持续到包含调用的完整表达式完成.

因此,当你说const C& c = F(C()),临时C()实际上在该语句结束时被破坏,并且在下一行不再有效.

也就是说,你的代码看起来运行正常,因为对c.True()的调用在编译时是已知的,并且函数定义实际上并没有引用c中的任何数据,所以临时是死的事实并没有确实会影响观察到的行为.然而,这是技术上未定义的行为.

转载注明原文:c – 为什么在临时对象被销毁后不会崩溃 - 代码日志