C++0xの「12.8クラスオブジェクトのコピーと移動[class.copy]段落31」でコピーの省略が発生した場合、正確には次のようになります。
特定の基準が満たされると、実装はクラス オブジェクトのコピー/移動の構築を省略できます [...]。コピー省略と呼ばれるこのコピー/移動操作の省略は、次の状況で許可されます [...]:
- クラスの戻り値の型を持つ関数の return ステートメントで、式が関数の戻り値の型と同じ cv-unqualified 型を持つ不揮発性の自動オブジェクト [...] の名前である場合、コピー/移動操作は可能です。自動オブジェクトを関数の戻り値に直接構築することで省略可能
- [...]
そして今、これにより次のコードでコピーを回避できるかどうか疑問に思います
vector<string> gen(const char *fn) {
if(fn == nullptr) // this should prevent RVO
return {"House", "Horse", "Hen"};
vector<string> res;
fillFromFile(res, fn);
return res; // copy elision possible?
}
int main() {
vector<string> data = gen("users.dat");
}
それとも、そのルールは例に当てはまらないので、明示的に行う必要がありますか?
return move(res); // explicitly prevent copy
私の意図は、明らかなReturn Value Optimization (RVO)if
を排除することであったことに注意してください。
それとも、ここで完全に間違った方向に進んでいますか? 右辺値参照を使用できるreturn
とmoveに関連する変更がありましたよね?