9

重複の可能性:
値渡しは C++11 の妥当なデフォルトですか?

私はスピードが欲しいを読んでいますか?値渡し。コピー省略と RVO についての Dave Abrahams による。そして、なぜコピー省略が必要なのだろうか?

コピーを避けるために、関数の引数を const 参照で渡す必要があると何度も言われました (私が読んだほぼすべての C++ 本で、これについて教えてもらいました)。

2 つの関数があるとします。

int f1(const string &s);
int f2(string s);

実引数が右辺値の場合、両方の関数でコピーが回避されます。しかし、実際の引数が左辺値の場合、コピーは f2 ではなく f1 でのみ回避されます。では、なぜこの機能が必要なのでしょうか?

4

3 に答える 3

11

とにかくコピーが必要な場合は、値で渡します。f1 の署名を選択するか、f2 の署名を選択するかは、関数の内容によって異なります。たとえば、この場合は const 参照を使用します。

int f1(const string& s) {
    return s.size();
}

ただし、この場合は値渡しになります。

int f2(string s) {
    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end());
    return s.size();
}

代替手段は次のようになるためです。

int f2(const string& s) {
    string temp(s);
    sort(temp.begin(), temp.end());
    temp.erase(unique(temp.begin(), temp.end()), temp.end());
    return temp.size();
}
于 2012-07-07T09:07:21.173 に答える