已显式删除移动构造函数

Explicitly deleted move constructor

本文关键字:移动 构造函数 删除      更新时间:2023-10-16

为什么:

struct A
{
A(int) {
cout << "construct from int" << endl;
}
A(A&&) = delete;
A(const A &) {
cout << "copy constructor" << endl;
}
};
int main(){
A a = 0;
}

给我一个错误:

error: use of deleted function ‘A::A(A&&)’

为什么当我添加这样的移动构造函数

A(A&&) {
cout << "move constructor" << endl;
}

它编译得很好,但程序的输出只是

construct from int

据我所知,编译器要求构造函数,但并没有使用它。为什么?这对我来说毫无意义。

附言:我认为

A a = 0;

相当于

A a = A(0);

但是为什么既不调用move构造函数也不调用move-assignment运算符呢?

根据C++标准(12.8复制和移动类对象)

31当满足某些标准时,允许省略实现类对象的复制/移动构造,即使构造函数为复制/移动操作选择和/或为物体有副作用。在这种情况下,实现会处理省略的复制/移动操作的源和目标仅为两个指代同一物体的不同方式,以及当两个对象如果没有优化,就会被破坏。122允许在以下情况(可以组合以消除多个副本):。。。。--当尚未绑定到引用的临时类对象(12.2)将被复制/移动到具有相同cv不合格类型,复制/移动操作可以通过将临时对象直接构建到省略复制/移动

30如果复制/移动构造函数或对象的复制/移动赋值运算符是隐式odr使用的,并且特殊成员功能不可访问(第11条)。[注:使用复制/移动构造函数将一个对象复制/移动到另一个对象或者复制/移动分配运算符没有更改布局,或者任一对象的大小--尾注]