機能があります
struct foo {
std::vector<int> v;
};
foo func();
関数から戻るときに、 foo内のベクトルは移動またはコピーされますか?
移動します。(*)
クラスに明示的なmoveコンストラクターを指定しないためfoo
、コンパイラーは、クラスのすべてのメンバーに対してmoveコンストラクター(使用可能な場合)を呼び出すものを暗黙的に生成します。std::vector
移動コンストラクターを定義しているため、呼び出されます。
C++11規格のパラグラフ12.8/15による:
非ユニオンクラスXの暗黙的に定義されたコピー/移動コンストラクターは、そのベースとメンバーのメンバーごとのコピー/移動を実行します。[...]
また、コンパイラは、オブジェクトを値で返すときに、クラスのcopy/moveコンストラクターへの呼び出しを省略できることに注意してください。この最適化は、(名前付き)戻り値の最適化と呼ばれます。
(*)ここでは、内部に自動ストレージを備えたローカルオブジェクトを作成し、それを返すことがユースケースであると想定しています。foo()