1
#include <iostream>

using namespace std;

struct A
{
    A() {}
    A(const A &a) {
        cout << "copy constructor" << endl;
    }
    A& operator=(const A &a) {
        cout << "assigment operator" << endl;
    }
    A(A &&a) {
        cout << "move" << endl;
    }
    A& operator=(A &&a) {
        cout << "move" << endl;
    }
};

struct B {
    A a;
};

B func() {
    B b;
    return b;
}
int main() {
    B b = func();
}

これは「コピーコンストラクタ」を出力します。

クラスBの場合、ムーブコンストラクターとムーブ代入演算子は自動的に生成されますか?しかし、なぜそれはクラスAのコピーコンストラクターを使用し、移動コンストラクターを使用しないのですか?

4

1 に答える 1

2

私の場合、コピー/移動が省略されているため、何も印刷されません。ただし、次のような方法でRVOを阻止した場合:

extern bool choice;

B func() {
    B b1, b2;
    if (choice)
      return b1;
    return b2;
}

次に、次のように出力します。

move

コンパイラがmoveメンバーの自動生成をまだ実装していない可能性があります。

于 2012-08-11T15:34:58.743 に答える