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がキャプチャする一時は有効です。ハーブ・サッターはそれをよりよく説明できます

于 2012-11-08T00:16:15.527 に答える