#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&&啊)
(上面说的理解,如果有问题也请指正)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.