16

以下のコードは、問題なくコンパイルおよび実行されます。右辺値参照と std::forward についてきちんと把握し始めたと思ったちょうどその時、この非常に単純なコードは、私が理解していない右辺値について非常に基本的な何かがあることを明らかにします。どうか明らかにしてください。

#include <iostream>
#include <iomanip>
using namespace std;

void fn( int&& n )
{
    cout << "n=" << n << endl;
    n = 43;
    cout << "n=" << n << endl;
}


int main( )
{
    fn( 42 );
}

次のコマンド ラインを使用して g++ 4.7 でコンパイルします:
g++ --std=c++11 test.cpp

出力は次のとおりです。
n=42
n=43

私の主な問題は、コンパイラが関数 fn 内の「n」をどこに格納するかです。

4

2 に答える 2

6

ここで低レベルで何が起こっているかについて、いくつかの詳細を知ることができます。

  1. タイプの一時変数がintのスタックに作成されます main。値 42 が割り当てられています。

  2. テンポラリのアドレスが に渡されfnます。

  3. fnそのアドレスに 43 を書き込み、テンポラリの値を変更します。

  4. 関数は終了し、呼び出しを含む完全な式の最後で一時的に終了します。

于 2012-10-16T08:49:24.150 に答える
2

そのアドレス、つまり&nを取得すると、そのポインタ値が表示されます。

ローカル変数を関数とmainに貼り付けて、それらのアドレスも取得し、それがどこにあるかを確認できますが、それらの間の比較に依存することは未定義の動作になります。

intがconstでないことは正しくありません、あなたの関数はそれを取得します。同様に、r値参照を使用してコレクションでクラスを初期化し、クラスは後でそれを変更できます。つまり、constメンバーである必要はありません。ただし、コピーはありません。

「移動」されたオブジェクトは、標準では安定した使用可能な状態になりますが、実際に保持される値は未定義です。

于 2012-10-16T08:49:34.750 に答える