【发布时间】:2012-11-08 00:05:55
【问题描述】:
#include <iostream>
int foo()
{
return 0;
}
int main()
{
const int& a = foo();
std::cout << &a << std::endl;
}
在这段代码中,a 绑定到一个右值。获取地址是否合法? (我所说的合法是指:代码格式不正确?我是否导致了未定义的行为?)
【问题讨论】:
-
我会说没关系,因为临时对象的生命周期与它所绑定的 const 引用一样长,所以打印它的地址应该没问题。不过,我还不能引用它。
-
@chris: 值在寄存器而不是堆栈中返回的情况呢?
-
对我来说,它看起来像是具有已定义行为的格式良好的代码。 “引用绑定到的临时对象或引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在……”换句话说,此时值很漂亮就像任何其他本地人一样。
-
@qdii,我想过,但是当您获取地址时,我想它必须被卡在内存中。当您考虑它时,编译器可以将它想要的任何变量放在寄存器中,而不是将它们保存在内存中。因此,这相当于在这方面获取任何其他变量的地址。
-
@qdii:这是一个与您无关的实现细节。编译器需要尽一切努力使代码工作,如果这意味着不使用寄存器,那就这样吧。