显式删除了移动构造函数

时间:2017-10-14 22:06:03

标签: c++ c++11 constructor copy-constructor

为什么:

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);

但为什么既不移动构造函数也不移动赋值运算符?

1 个答案:

答案 0 :(得分:4)

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

  

31当满足某些标准时,允许省略实施   复制/移动类对象的构造,即使构造函数   选择用于复制/移动操作和/或析构函数   对象有副作用。在这种情况下,实施处理   省略的复制/移动操作的源和目标只是两个   引用同一个对象的不同方式,以及对它的破坏   该对象发生在两个对象的后期   没有优化就会被摧毁。这个省略   复制/移动操作,称为复制省略,是允许的   以下情况(可以合并以消除多个   份):   ....    - 当一个尚未绑定到引用的临时类对象时   (12.2)将被复制/移动到具有相同的类对象   cv-unqualified type,可以省略复制/移动操作   将临时对象直接构造到目标中   省略复制/移动

  

30如果复制/移动构造函数或者是复制/移动构造函数,则程序格式错误   对象的复制/移动赋值运算符隐式使用odr   无法访问特殊成员函数(第11条)。 [ 注意:   使用复制/移动构造函数将一个对象复制/移动到另一个对象   或复制/移动赋值运算符不会更改布局或   任何一个物体的大小。 - 后注]