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中的任何数据,因此,临时对象已死的事实并不会真正影响观察到的行为。但是,这是技术上未定义的行为。

08-26 20:14
查看更多