【发布时间】:2012-09-23 11:19:29
【问题描述】:
考虑以下处理 const 引用的代码:
const int & func (const int &x)
{
return x;
}
struct Foo {
Foo (const int &x)
: m_x(x) {}
const int & getX ()
{ return m_x; }
const int &m_x;
};
我想知道现在允许以下哪些(如果有):
int x = func(int(7));
int y = Foo(int(7)).getX();
是否可以保证临时int 对象在被赋值或getX 使用之前仍然存在?
更新:看来这是安全的 - 但究竟为什么呢?
- 是因为临时对象以递归方式绑定到 const 引用,并且只要对它们的绑定引用存在就保证存在?
- 还是因为它们在完整表达式的持续时间内保证存在?
考虑存储指针而不是引用的边缘情况:
struct Foo {
Foo (const int &x)
: m_x(&x) {}
const int & getX ()
{ return *m_x; }
const int *m_x;
};
int y = Foo(int(7)).getX();
如果情况 1) 是正确的,这似乎是行不通的。但如果情况 2) 是正确的,它会。
【问题讨论】:
-
这两个选项都不安全,临时变量只保证在创建它们的语句期间存在。
-
@DimaRudnik 所以?这使它们安全,因为它们被复制到
x和y。
标签: c++ reference return temporary