const 右辺値を返すことは、C++11 のアンチパターンです。まず、非 const 右辺値を返すことを検討してください。
std::vector<int> f(int n)
{
return std::vector<int>(n);
}
int main()
{
std::vector<int> v;
v = f(3);
}
C++98/03 では、このコードは少なくとも 2 回ヒープに移動します。
- f の内部にベクトルを作成するには (RVO が適用される場合)
- f のリターンから v に代入します。
コンパイラが RVO を適用しない場合、3 つのヒープ割り当てが得られます。
C++11 では、1 つのヒープ割り当てのみを取得します: 内にベクトルを作成しますf
。これは、RVO に関係なく発生します。その理由は、すべての STL コンテナーには、署名を持つムーブ コンストラクターとムーブ代入演算子があるためです。
vector( vector&& other );
vector& operator=( vector&& other );
右辺値参照&&
は、リソースを作成関数内から目的地に直接移動します。ただし、コードには署名があります
const std::vector<int> f(int n)
{
return std::vector<int>(n);
}
T&& (つまり、move コンストラクターと代入演算子の引数) は const rvalue パラメーター (つまり、関数の戻り値) にバインドされないため、move セマンティクスを無効にします。これにより、効率的にコードが C++98/03 で実行されるようになります (つまり、2 つまたは 3 つのヒープ割り当てで)。