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
将引用无效的临时C
当对象到达第 2 行时。
// 更新
我想更新这个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;
}
C++11 标准第 12.2/4 段规定在某些情况下临时变量的生命周期确实可以延长到生成它们的完整表达式的末尾:
有两个上下文其中临时变量在与完整表达式末尾不同的点被销毁。 [...]
第一个上下文不相关。然而,根据第 12.2/5 段:
第二个上下文是当引用绑定到临时对象时。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在except:
— 构造函数构造函数初始化程序 (12.6.2) 中引用成员的临时绑定将持续存在,直到构造函数退出。
— 函数调用 (5.2.2) 中对引用参数的临时绑定将持续存在,直到包含调用的完整表达式完成为止。
— 函数返回语句(6.6.3)中绑定到返回值的临时变量的生命周期不被延长;临时值在 return 语句中完整表达式的末尾被销毁。
— 与 new-initializer (5.3.4) 中引用的临时绑定持续存在,直到包含 new-initializer 的完整表达式完成为止。
在这里,临时搭建的C()
与参数绑定c
功能的F
。因此,临时变量在包含函数调用的完整表达式末尾被销毁F()
,返回的引用是dangling.
调用函数True()
其原因未定义的行为.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)