5
#include <iostream>
int foo()
{
  return 0;
}

int main()
{
  const int& a = foo();
  std::cout << &a << std::endl;
}

在此代码中,a绑定到一个右值。获取地址是否合法?(通过法律我的意思是:在代码格式错误?我是否导致了未定义的行为?)

4

2 回答 2

6

这可以。在 C++11 中,您甚至可以这样做:

int&& a = foo();
a = 123;

您可以考虑这样的临时工(从概念上和一般情况下):

x = func(); // translated as:

auto __temporary = func();
x = __temporary;
__destruct_value_now_and_not_later(__temporary);

除非x是引用类型的定义,否则编译器会注意到您有意引用临时值并通过删除早期销毁代码来延长其生命周期,使其成为普通变量。

于 2012-11-08T00:16:36.850 回答
3

是的。在变量a超出范围之前,它捕获的临时变量是有效的。Herb Sutter 可以更好地解释它

于 2012-11-08T00:16:15.527 回答