cha*_*ink 2 c++ constructor destructor move-constructor copy-elision
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A()" << endl;
}
A(const A& a) {
cout << "A(const A& a)" << endl;
}
A(A&& a) {
cout << "A(A&& a)" << endl;
}
A& operator=(const A& a) {
cout << "operator=(const A& a)" << endl;
return *this;
}
A& operator=(A&& a) {
cout << "operator=(A&& a)" << endl;
return *this;
}
~A() {
cout << "~A()" << endl;
};
};
A foo() {
A a;
return a;
}
int main() {
A a = foo();
}
Run Code Online (Sandbox Code Playgroud)
编译:
clang++ test.cpp -o test -std=c++11
Run Code Online (Sandbox Code Playgroud)
输出:
A()
~A()
Run Code Online (Sandbox Code Playgroud)
为什么输出中只有一对A()和~A()?
为什么不调用移动构造函数?
编译器是否完成了一些代码优化?
由于Copy Elision,未调用移动(或复制)构造函数.编译器直接在返回值位置构造局部变量.
此类优化也称为RVO(返回值优化).
编译器有一定的条件允许这样的优化,它们在标准中提到.但是引用Scott Meyers关于这些条件的有效现代C++第25项可能更方便(不像标准中那么严格的信息,但可能更有效地吸收):
如果(1)本地对象的类型相同,则复制(或移动)函数中的本地对象的复制(或移动),如果(1)本地对象的类型相同,则可以解释标准的法律主义(可论证是有毒的)散文.由函数返回的和(2)本地对象是返回的内容.