4

次の例を見てください。

string foo(int i) {
  string a;
  ... Process i to build a ...
  return a;
}

void bar(int j) {
  const string& b = foo(j);
  cout << b;
}

私はRVOとNRVOを知っていますが、それを行うには、次のようにバーを書く必要があると思いました。

void bar(int j) {
  string b = foo(j);
  cout << b;
}

どちらのバージョンも機能しているようで、同じパフォーマンスであると思います。最初のバージョン(const参照付き)を使用しても安全ですか?

ありがとう。

4

4 に答える 4

7

const 参照への一時的な割り当ては完全に有効です。一時オブジェクトは、参照が範囲外になるまで存続します。

あなたの例では意味がありませんが、この機能は関数の引数によく使用されます。

string foo(int i) {
    string a;
    // ...
    return a;
}

void bar(const string& str) {
    // ...
}

void buzz() {
    // We can safely call bar() with the temporary string returned by foo():
    bar(foo(42));
}
于 2011-05-24T08:21:40.650 に答える
3

この単純なケースでは安全です。ただし、安全でないコードを追加するのは簡単ですが、C ++を知っている人にとっては混乱を招きます。なぜここで参照が必要なのですか?そうする理由はありません、そしてそのようなコードは一般的に避けられるべきです。

于 2011-05-24T08:13:36.947 に答える
2

const-referenceは一時的なものにバインドでき、一時的なもののライブ時間はconst-referenceのライブ時間に延長されます。そうです、安全に使用できます。

于 2011-05-24T08:15:43.127 に答える
2
于 2011-05-24T08:45:07.573 に答える