#include <iostream>
int foo()
{
return 0;
}
int main()
{
const int& a = foo();
std::cout << &a << std::endl;
}
このコードでa
は、右辺値にバインドします。そのアドレスを取ることは合法ですか?(そして、法的には、コードの形式が正しくありませんか?未定義の動作を引き起こしていますか?)
これで問題ありません。C++11 では、次のようにすることもできます。
int&& a = foo();
a = 123;
このような一時的なものについて考えることができます(概念的にも一般的にも):
x = func(); // translated as:
auto __temporary = func();
x = __temporary;
__destruct_value_now_and_not_later(__temporary);
が参照型の定義である場合を除いてx
、コンパイラは一時値を意図的に参照していることに注意し、早期破棄コードを削除して通常の変数にすることでその寿命を延ばします。
はい。変数が範囲外になるまで、変数a
がキャプチャする一時は有効です。ハーブ・サッターはそれをよりよく説明できます。