获取const lvalue引用的地址是否合法?

时间:2012-11-08 00:05:56

标签: c++ lvalue rvalue

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

x = func(); // translated as:

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

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

答案 1 :(得分:2)

是。在变量a超出范围之前,它捕获的临时值是有效的。 Herb Sutter can explain it better