0

以下のコードはC++11で有効であることを読みました。

int && a = 3;
a = 4;

数値リテラル3が格納されているメモリアドレスに4を書き込むことになっていますか?コンパイラの最適化によってはこれが起こらないようになるかもしれませんが、そうすることになっていますか?

4

1 に答える 1

7

クラスタイプではないprvalueを右辺値参照に割り当てると、一時オブジェクトが作成され、参照がそれにバインドされます。一時オブジェクトを変更しているだけです。

タイプ「cv1」への参照は、タイプ「cv2 T1」の式によって次のように初期化さT2れます。

  • 参照が左辺値参照の場合[...]

  • それ以外の場合、[...]または参照は右辺値参照でなければなりません

    • イニシャライザ式の場合

      • xvalue(ビットフィールドではない)、クラスprvalue、配列prvalueまたは関数lvalue [...]、または

      • クラスタイプがあります[...]

      [...]

    • それ以外の場合は、タイプ「cv1 T1」の一時オブジェクトが作成され、非参照コピー初期化(8.5)のルールを使用して初期化式から初期化されます。次に、参照は一時的なものにバインドされます。

概念的には、prvalueは、メモリ内のオブジェクトから取得された場合とされていない場合がある単なる値です。リテラルには対応するオブジェクトがメモリにないため、このルールによりオブジェクトが強制的に作成されます。

于 2013-03-27T11:34:54.083 に答える