[英]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.