のは、この2つの関数を考えてみましょう:C++の戻り値の最適化、複数の無名の戻り
// 1. Multiple returns of the same named object
string f() {
string s;
if (something())
return s.assign(get_value1());
else
return s.assign(get_value2());
}
と
// 2. Multiple returns, all of unnamed objects
string g() {
if (something())
return get_value1();
else
return get_value2();
}
これらの各機能は、実際にRVOの面でどのように動作するかはもちろん、コンパイラに依存します。しかし、両方のRVOが共通であると仮定するのは間違いありませんか?
p.s.(答えを参照)機能#1は、次のことを意図していた。
string f() {
string s;
if (something())
return s;
s.assign(get_value());
return s;
}
返信いただきありがとうございます。私は 'get_value'を' string'と評価すると思いました。そして例を圧縮するときに私は過剰になりました。#1の意味は、実際には 'string sのようになります。 if(sthg()){return s;} s.assign(get_value()); return s; '。私が不注意であれば、 "コピーエリシエーション"は起こりません。私の質問は主に2番目のケースに焦点を当てていたので、私はそれを解決済みとしてマークし、さらに編集しません。 –
@ n.caillouそのコンストラクションは、コピーエリジョンの標準要件のすべてのチェックボックスにチェックを入れ、GCCとClangからはNRVOを取得しますが、MSVC(2015 Update 3)からはNRVOを取得しないように見えます。それでもそれを混乱させる。しかし、 's'から戻り値への動きを生成します。これは、標準準拠です。あなたのケースでMSVCが重要な場合は、 'return s;'のためにある場所で返すように関数を書き直すほうが良いでしょう。 3つのコンパイラすべてで、複数の 'return get_value();'がうまくいきます - prvaluesは、コンパイラが分析する方が簡単です。 – bogdan
2番目の考えでは、私はこのコメントを答えに移すと思います。 – bogdan