#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "default constructor" << endl;
}
A(const A& x) {
cout << "copy constructor" << endl;
}
A(A&& x) {
cout << "move constructor" << endl;
}
A& operator = (const A& x) {
cout << "copy assigment operator" << endl;
return *this;
}
A& operator = (A&& x) {
cout << "move assigment operator" << endl;
return *this;
}
};
A returnValue() {
return A();
}
A returnValue_1() {
A a;
return a;
}
A&& returnValue_2() {
return A();
}
int main() {
A e = returnValue(); // move constructor
cout << endl;
A e1 = returnValue_1(); // move constructor
cout << endl;
A e2 = returnValue_2(); // move constructor
return 0;
}
/*
default constructor
default constructor
move constructor
default constructor
move constructor
A e = returnValue();只打印了一句,我理解执行A()打印了 default constructor ,然后 return 时经过 RVO 优化,就少打印一次。然后经过 https://en.cppreference.com/w/cpp/language/copy_initialization 里面提到的 纯右值的优化,又少打印一次。
A e2 = returnValue_2();打印两次是因为:执行A()打印了 default constructor ,然后 return 时经过 RVO 优化,就少打印一次。但由于函数返回值类型为 A&&,作为 亡值,就必须调用 移动构造函数。
但 A e1 = returnValue_1();为什么打印这两句阿?(它的返回值类型就是 A ,不是 A&&啊)
顺便问下,移动赋值操作符这里的提示是啥意思呀
(上面说的理解,如果有问题也请指正)