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

可能是您的编译器尚未实现移动成员的自动生成。

于 2012-08-11T15:34:58.743 回答