繁体   English   中英

显式删除了移动构造函数

[英]Explicitly deleted move 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

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

PS我认为

A a = 0;

是等价的

A a = A(0);

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

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

31当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。 在这种情况下,实现将省略的复制/移动操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象的后期时间。在没有优化的情况下销毁。这种复制/移动操作的省略,称为复制省略,在以下情况下允许(可以组合以消除多个副本):.... - 当一个未绑定的临时类对象时将引用(12.2)复制/移动到具有相同cv非限定类型的类对象, 可以通过将临时对象直接构造到省略的复制/移动的目标中来省略复制/移动操作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM