C++の移動セマンティクスには多くの機会を逃しているようです。これらの背後にある理論的根拠と、次の場合に変数を移動するタイミングを標準がより積極的に定義しない理由を理解したいと思います。
string f()
{
string s;
return s + " ";
}
これはoperator+(const string&, const char*)
、ではなくoperator+(string&&, const char*)
、を呼び出します。これs
は、左辺値であるためだと思います。関数でのローカル変数の最後の使用では、変数は移動可能であると見なされると標準は言うことができませんでしたか?
私はやや似た例だと思います:
struct A { A(string&&); };
string g()
{
string s;
return s; // s is moved
}
A h()
{
string s;
return s; // s can't be moved!
}
g
移動セマンティクスを使用してデータをからs
戻り値に移動しますが、に移動されh
ないためコンパイルされません。これは、標準には、戻り型とまったく同じ型のローカル変数を返すと、変数が移動されるという基本的なケースがあるためだと思います。ローカル変数を返すと、そのタイプに関係なく移動されるというルールがないのはなぜですか?s
h
g