1

次のようなC++コードのスニペットを見つけました。

// constructor that creates a 2D vector _store[nRow][nCol]
FlexiMatrix::FlexiMatrix(int nRow)
{
    for (int i = 0; i < nRow; i++){
        _store.push_back( vector<int>() );    
        _store[i].push_back( 0 );
    }
}

そして_store、次のように宣言されています。vector< vector<int> > _store;

ローカル変数とスタックの理解に違反しているようです。このコンストラクターを終了した瞬間に、ローカルで作成されたベクターのメモリーが存在しなくなるべきではありませんか?これはvector<int>.push_back()、入力パラメーターとしてエイリアス参照を必要とするため、コピーコンストラクターが呼び出されることはなくpush_back()、ローカル変数への実際の参照は何を受け取るのでしょうか。

4

1 に答える 1

6

したがって、コピーコンストラクターが呼び出されることはなくpush_back()、ローカル変数への実際の参照は何を受け取りますか?

いいえ
std::vector_push_back()。渡されたオブジェクトのコピーを作成します。パラメータとして渡されたオブジェクトのコンテンツは、新しく作成されたオブジェクトに(C ++ 11で) コピー/移動される場合があります。

push_back()C ++ 11以降には、次の2つの形式があります。

void push_back (const value_type& val);
void push_back (value_type&& val);

あなたの場合、vector<int>()temporary(r-value)を作成するため、2番目の形式が使用されます。この2番目のフォームは、一時的なコンテンツを、ベクターに追加される新しいオブジェクトに移動します。したがって、コピーコンストラクターではなく、移動コンストラクターを使用します。

于 2012-12-01T04:35:27.997 に答える