2012-03-06 15 views
6

可能性の重複:
Does a const reference prolong the life of a temporary?C++のconst参照に一時的なintを代入するとどうなりますか?

letが、私は機能fを持っていることを言う:

int f(int x){return x;} 

const int &a=f(1); 

私はf(1)はただ一時的なもので、私がなることを知っていますこの声明の後に破棄されたが、

  1. constを作成するとf(1)の寿命が長くなるのですか?
  2. の場合は、f(1)が保存されますか?
  3. そして、xもスコープを使い果たしたときに破壊されなかったということですか?
  4. f(1)xの違いは何ですか?
+0

良いC++の本が必要です。 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

+4

@Benを参照してください。 –

+0

@Konrad:たぶん彼は最後の質問に言及していたでしょう... –

答えて

8

あなたは値を混同しています。

1)式f(1)によって返された一時的な値の有効期間は、その有効期間が延長されます。このルールはconstの参照で一意です。

2)コンパイラが必要とするが、おそらくスタック上にある。

3)多分。コンパイラがxをコピーしたか、またはコピーを実行したかによって異なります。タイプはintなので、問題ではありません。

4)多くの違いがあります。一つはint f(int)のローカル変数の名前です。それは左辺値です。もう1つは、int f(int)を呼び出し、右辺値に評価される式です。

+0

:式が値を返すが、この値がf(1)にどのように格納されるのか、コンパイラはf(1)を1に代入するだけです:int f ;または、他の何か ? – AlexDan

2

const&に一時的にバインドすると、一時的なライフタイムが参照の有効期間まで延長されます。

+0

一時的な存続期間を延ばせば、f(1)はどこに格納され、それ自身のアドレスを持ち、通常の変数のように変更できますか? – AlexDan

+0

@AbdessamadBond通常の変数のように変更できるかどうかは未定の質問です。それを変更できるようにするには 'const_cast'が必要ですし、その場合でも結果は未定義の動作になる可能性があります。 (私はその意図が未定義の動作であると思っていますが、これを必要とする文言が標準で実際に出現していることははっきりしていません)。 –

+0

@JamesKanze UBが 'const_cast'によって引き起こされる唯一のケースは、 'const'と宣言されています。私が見る限り、これは決して一時的なものではありません。 – pmr

関連する問題