Guaranteed copy elision 缺省复制

在c++17上,通过对value category修改,glvalue提供要被初始化的对象的地址,prvalue提供initializer。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 


class A {
public:
A() = default;


A(A &&prev) = delete;


// A(A &&prev) { std::cout << "Print1"; }
};
int main() {
A a = A();
std::cout << "aaa";
}

所以上面的代码,在c++17之前是编译不过的,A a = A() 这里调用了move构造,虽然编译器会优化掉,不会真正调用,但是move构造必须留着,不能删除。

但是在c++17后,是直接在value category层级,就保证了不会调用move构造。