为什么:
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
据我所知,编译器要求构造函数但不使用它。为什么?这对我来说毫无意义。
P.S。我认为
A a = 0;
与
等价A a = A(0);
但为什么既不移动构造函数也不移动赋值运算符?
答案 0 :(得分:4)
根据C ++标准(12.8复制和移动类对象)
31当满足某些标准时,允许省略实施 复制/移动类对象的构造,即使构造函数 选择用于复制/移动操作和/或析构函数 对象有副作用。在这种情况下,实施处理 省略的复制/移动操作的源和目标只是两个 引用同一个对象的不同方式,以及对它的破坏 该对象发生在两个对象的后期 没有优化就会被摧毁。这个省略 复制/移动操作,称为复制省略,是允许的 以下情况(可以合并以消除多个 份): .... - 当一个尚未绑定到引用的临时类对象时 (12.2)将被复制/移动到具有相同的类对象 cv-unqualified type,可以省略复制/移动操作 将临时对象直接构造到目标中 省略复制/移动
和
30如果复制/移动构造函数或者是复制/移动构造函数,则程序格式错误 对象的复制/移动赋值运算符隐式使用odr 无法访问特殊成员函数(第11条)。 [ 注意: 使用复制/移动构造函数将一个对象复制/移动到另一个对象 或复制/移动赋值运算符不会更改布局或 任何一个物体的大小。 - 后注]