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/

10-15 06:02