#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&&啊)
顺便问下,移动赋值操作符这里的提示是啥意思呀
(上面说的理解,如果有问题也请指正)
