0

私はこれらの機能を持っています:

vector<int> foo1() {
    vector<int> v;
    return v;
}

void foo2( vector<int>& parameter ) {
    // Do something
}

void foo3( vector<int> par ) {
    foo2( par );
}
...
foo2(foo1());   // Doesn't work (1)
foo3(foo1());   // Works (2)

関数 foo2 をそのまま保持する方法はありますか?これはベクトルをパラメーターとして渡す最適な方法であり、(1) を機能させるためにオーバーロードする可能性がありますか? または、これを行うより良い方法はありますか?

4

1 に答える 1

2

参照渡しは、通常、呼び出し元に値を返すために使用されるパラメーターである「出力パラメーター」に使用されます。

void bar(int &i, int &j);

int i, j;
bar(i, j); // sets i and j
// use i and j values here

C++ では、非 const 左辺値への一時的なバインドが許可されていません。したがって、これは機能しません:

bar(1,2);

ただし、一時変数をコピーせずに渡すことができるようにする必要があり、C++11 より前では、一時変数をconst左辺値参照にバインドできるようにすることで、この必要性が満たされていました。これは、temporary を out パラメータとして誤って使用することを防ぐ特別な規則ですが、コピーを避けることができます。

ベクトルを出力パラメーターではなく入力パラメーターとして使用しているため、コピーを回避する適切な方法は次のとおりです。

void foo2(vector<int> const &parameter) {
    // Do something
}

「何かをする」コードが最終的にベクトルのコピーを作成する場合は、これを行う方がよいでしょう:

void foo2(vector<int> parameter) {
    // Do something
}

これにより、コンパイラが を呼び出す特定のケースでコピーを最適化できるためfoo2、おそらくコピーが削除されます。

于 2012-10-26T21:40:19.017 に答える