以下のようなプログラムを書きました。
#include <iostream>
using namespace std;
class A {
public:
A() {
}
A(A &a) {
id = a.id;
cout << "copy constructor" << endl;
}
A& operator=(A &other) {
id = other.id;
cout << "copy assignment" << endl;
return *this;
}
A(A &&other) {
id = other.id;
cout << "move constructor" << endl;
}
A& operator=(A &&other) {
id = other.id;
cout << "move assignment" << endl;
return *this;
}
public:
int id = 10;
};
A foo() {
A a;
return a;
}
int main()
{
A a;
A a2(a); // output: copy constructor
A a3 = a2; // output: copy constructor
a3 = a2; // output: copy assignment
A a4 = foo(); // output:
a4 = foo(); // output: move assignment
return 0;
}
Mac OSでコンパイルしました。出力は次のとおりです。
copy constructor
copy constructor
copy assignment
move assignment
私の質問は次のとおりです。
- の出力
A a4 = foo();
が空なのはなぜですか? 移動コンストラクターを呼び出す必要があると思いました。 - の出力
A a3 = a2;
がのcopy constructor
代わりにあるのはなぜcopy assignment
ですか?