C++ C+中局部变量和返回变量的构造与分解+;

C++ C+中局部变量和返回变量的构造与分解+;,c++,constructor,destructor,move-constructor,copy-elision,C++,Constructor,Destructor,Move Constructor,Copy Elision,输出: clang++ test.cpp -o test -std=c++11 为什么输出中只有一对A()和~A() 为什么不调用移动构造函数 编译器是否进行了一些代码优化?由于以下原因,未调用移动(或复制)构造函数。 编译器直接在返回值处构造局部变量 这种优化也称为RVO(返回值优化) 编译器允许这样的优化有一定的条件,标准中提到了这些条件。但就这些条件而言,引用第25项可能更为方便(不像标准中那样严格,但吸收效率可能更高): 译述标准中的法律主义(可以说是有毒的)散文,[…]编译器可以省略

输出:

clang++ test.cpp -o test -std=c++11
为什么输出中只有一对A()和~A()

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

编译器是否进行了一些代码优化?

由于以下原因,未调用移动(或复制)构造函数。 编译器直接在返回值处构造局部变量

这种优化也称为RVO(返回值优化)

编译器允许这样的优化有一定的条件,标准中提到了这些条件。但就这些条件而言,引用第25项可能更为方便(不像标准中那样严格,但吸收效率可能更高):

译述标准中的法律主义(可以说是有毒的)散文,[…]编译器可以省略对本地对象的复制(或移动) 在一个 函数,如果(1)本地对象的类型与 由函数返回,(2)本地对象是返回的对象

clang++ test.cpp -o test -std=c++11
A()
~A()