10

私はこのコードを持っています(簡易版):

const int& function( const int& param )
{
     return param;
}

const int& reference = function( 10 );
//use reference

C++03 標準 $12.2/5 文言がどの程度かは、よくわかりません。

参照がバインドされている一時、または一時がバインドされているサブオブジェクトへの完全なオブジェクトである一時は、参照の存続期間中持続します...

ここに適用されます。

上記のコードの変数は有効ですreferenceか、それともぶら下がっていますか? 呼び出し元のコードでの参照は、パラメーターとして渡された一時の有効期間を延長しますか?

4

4 に答える 4

12

完全式は、別の式の部分式ではない式です。この場合、呼び出しを含む完全な式function( 10 )は代入式です。

const int& reference = function( 10 );

function引数で呼び出すために10、一時的な const 参照オブジェクトが一時的な整数オブジェクトに作成されます10。一時的な整数と一時的な const-reference の有効期間は代入を通じて延長されるため、代入式は有効ですが、によって参照される整数を使用しようとすると、ライブ オブジェクトを参照しなくなるため、reference未定義の動作になります。reference

C++11 標準は、状況を明確にしていると思います。

参照がバインドされている一時オブジェクト、または参照がバインドされているサブオブジェクトの完全なオブジェクトである一時オブジェクトは、次の例外を除き、参照の存続期間中持続します。

...

— 関数呼び出し (5.2.2) の参照パラメーターへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続します。

「参照がバインドされている一時的なものは...参照の存続期間中存続します」。この場合、一時整数の存続期間と同様に、参照の存続期間は代入式の最後で終了します。

于 2012-04-17T15:17:11.143 に答える
2

C ++ 11の観点から、関数によって返される参照は一時的なものではありません。

12.12.1クラスタイプのテンポラリは、さまざまなコンテキストで作成されます。参照をprvalue(8.5.3)にバインドし、prvalue(6.6.3)を返し、prvalue(4.1、5.2.9、5.2.11)を作成する変換を返します。 、5.4)、例外のスロー(15.1)、ハンドラーの入力(15.3)、および一部の初期化(8.5)。

参照を返す関数はprvalue( "pure rvalue")を返さないため、一時的なものではありません。これは非常に自然なことのようです。コンパイラは参照されるオブジェクトの存続期間を管理できません。プログラマの責任です。

したがって、コンパイラは、一時的なものに制限されていないため、const int&referenceのliftime保証を提供しません。

于 2012-04-17T14:51:43.553 に答える
2

これはコンパイルされますが、ぶら下がっている参照になってしまいます。param返品後に解放されfunctionます。

  1. 関数は、一時的な匿名オブジェクトへの参照を使用して呼び出されます
  2. 関数は参照を返します
  3. 関数が一時パラメータを返したので、解放されます
  4. オブジェクトが破壊されたため、参照がぶら下がっています

非constにした場合、匿名オブジェクトにnon-const参照を渡すことができないため、コンパイルされませんでした。

于 2012-04-17T11:55:27.077 に答える
1

重要なのはこの部分です

参照がバインドされる一時的な

この場合、パラメータは一時的なものにバインドされ、呼び出し後に破棄されます。

参照を渡すことによって、寿命をさらに延長することはできません。

于 2012-04-17T11:55:56.903 に答える