11

私が機能を持っているとしましょう

#include <string>

std::string const foo()
{
    std::string s = "bar";
    return s;
}

int main()
{
    std::string t = foo();
}

とのタイプが-nessの違いのためにの戻りタイプとは異なるt場合でも、コンパイラはの(名前付き)戻り値の最適化を実行できますか?stfooconst

(C++03とC++11で答えが異なる場合は、C ++ 03の答えを知ることに間違いなく興味があります。)

4

1 に答える 1

14

RVO最適化がの約束を破る方法はないconstので、問題はありません。RVOを実行できます。


ただし、移動セマンティクスはの影響を受けconstます。ムーブセマンティクス、つまりT(T&&)コンストラクターまたはムーブ代入演算子の呼び出しを効果的に無効にします。constしたがって、一般的に、戻り値には使用しないでください。

Scott Meyersは当初const、より適切なコーディングのために、戻り値を推奨していました。

次に、アンドレイ・アレキサンドレスクは、 DDJのMojoの記事で、今後、移動セマンティクスをconst使用して、戻り値を禁止する方がよいと述べ、スコットの以前のアドバイスは無視しました。


今では、NRVOなどのさまざまな特殊なRVOの頭字語をわざわざ学ぶことはありませんでした。そして主な理由は、これらの意味が途中で変更され、元々はg++コンパイラのカスタム機能で1つの意味を持っていたためです。ここでの用語は単なる混乱です。

ですから、私の用語が間違っていて、他の頭字語を使うべきだった場合は、遠慮なく訂正してください。:-)

于 2013-01-20T22:24:34.597 に答える