10

機能があります

struct foo {
    std::vector<int> v;
};

foo func();

関数から戻るときに、 foo内のベクトルは移動またはコピーされますか?

4

1 に答える 1

11

移動します。(*)

クラスに明示的なmoveコンストラクターを指定しないためfoo、コンパイラーは、クラスのすべてのメンバーに対してmoveコンストラクター(使用可能な場合)を呼び出すものを暗黙的に生成します。std::vector移動コンストラクターを定義しているため、呼び出されます。

C++11規格のパラグラフ12.8/15による:

非ユニオンクラスXの暗黙的に定義されたコピー/移動コンストラクターは、そのベースとメンバーのメンバーごとのコピー/移動を実行します。[...]

また、コンパイラは、オブジェクトを値で返すときに、クラスのcopy/moveコンストラクターへの呼び出しを省略できることに注意してください。この最適化は、(名前付き)戻り値の最適化と呼ばれます。

(*)ここでは、内部に自動ストレージを備えたローカルオブジェクトを作成し、それを返すことがユースケースであると想定しています。foo()

于 2013-02-25T19:06:28.210 に答える