はのは、私が機能を持っているとしましょう:C++ 0xの戻り値はrvalue参照で渡されますか?
typedef std::vector<int> VecType;
VecType randomVector();
int processing()
{
VecType v = randomVector();
return std::accumulate(v.begin(), v.end(), 0);
}
C++ 0xのは、具体的スプリアスコピーがrandomVectorの戻り値から回避されると言っていますか?あるいは、コンパイラはRVOを実装する必要がありますか? randomVector()
の値がrvalueとして扱われ、vのmoveコンストラクタが呼び出されるはずですが、これが本当であるかどうかは完全にはわかりません。コンパイラはRVOを行うことができる場合
良い質問ではありません、IMHO。標準では、実装が何をしているのか、それがしなければならないことだけを有用に述べることはできません。 –
実際、戻り値最適化を指定した例では、ほとんどのコンパイラで最適化が行われています...したがって、それは右辺値なしで有効です。 引数を関数に渡すためには、rvalueが重要です。 – Artyom
質問のタイトルは少し誤解を招く。あなたの関数はrvalueを返しますが、参照は返しません。しかし、rvalue参照はそれにバインドすることができます。何らかの理由でコピーエリミッションを実行できず、型に移動コンストラクタがある場合(移動コンストラクタのパラメータはrvalue参照です) – sellibitze