Isl*_*iev 6 c++ constructor copy-constructor c++11
为什么这个:
struct A
{
A(int) {
cout << "construct from int" << endl;
}
A(A&&) = delete;
A(const A &) {
cout << "copy constructor" << endl;
}
};
int main(){
A a = 0;
}
Run Code Online (Sandbox Code Playgroud)
给我一个错误:
error: use of deleted function ‘A::A(A&&)’
Run Code Online (Sandbox Code Playgroud)
为什么当我添加这样的移动构造函数
A(A&&) {
cout << "move constructor" << endl;
}
Run Code Online (Sandbox Code Playgroud)
编译很好,但程序的输出只是
construct from int
Run Code Online (Sandbox Code Playgroud)
所以据我所知,编译器要求构造函数但不使用它.为什么?这对我来说毫无意义.
PS我认为
A a = 0;
Run Code Online (Sandbox Code Playgroud)
是等价的
A a = A(0);
Run Code Online (Sandbox Code Playgroud)
但为什么既不移动构造函数也不移动赋值运算符?
根据 C++ 标准(12.8 复制和移动类对象)
\n\n\n\n\n31 当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有侧面影响。在这种情况下,实现将省略的复制/移动操作的源和目标视为引用同一对象的两种不同方式,并且该对象的销毁发生在以下时间的较晚时间:如果没有优化,这两个对象就会被销毁。122 这种复制/移动操作的省略(称为复制省略)在以下情况下是允许的(可以组合起来消除多个副本):\ n ....\n \xe2\x80\x94 当尚未绑定到引用的临时类对象\n (12.2) 被复制/移动到具有相同\n cv 不合格类型的类对象时,通过将临时对象直接构造到\n 省略的复制/移动的目标中,可以省略复制/移动操作
\n
和
\n\n\n\n30 如果对象的复制/移动构造函数或复制/移动赋值运算符被隐式使用,并且特殊成员函数不可访问(第 11 条),则程序是格式错误的。[ 注意:\n 使用复制/移动构造函数或复制/移动赋值运算符将一个对象复制/移动到另一个对象中不会更改任一对象的布局或大小。\xe2\x80\x94结束注]
\n