C++中局部变量和返回变量的构造和破坏

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()?

为什么不调用移动构造函数?

编译器是否完成了一些代码优化?

k.v*_*.v. 6

由于Copy Elision,未调用移动(或复制)构造函数.编译器直接在返回值位置构造局部变量.

此类优化也称为RVO(返回值优化).

编译器有一定的条件允许这样的优化,它们在标准中提到.但是引用Scott Meyers关于这些条件的有效现代C++第25项可能更方便(不像标准中那么严格的信息,但可能更有效地吸收):

如果(1)本地对象的类型相同,则复制(或移动)函数中的本地对象的复制(或移动),如果(1)本地对象的类型相同,则可以解释标准的法律主义(可论证是有毒的)散文.由函数返回的和(2)本地对象是返回的内容.