猿问

自动生成移动操作的规则是什么?

在C ++ 98中,C ++编译器可以通过成员级副本自动生成副本构造函数和副本赋值运算符,例如


struct X {

    std::string s;

    std::vector<int> v;

    int n;

};

编译器会使用成员级副本自动为生成副本构造函数和副本赋值运算符X。


但是在C ++ 11中,具有移动语义的事物如何发生变化?


是否自动生成了移动 构造函数和移动 赋值运算符 ,如复制构造函数和复制赋值运算符?


在某些情况下不会自动生成移动操作吗?


拉丁的传说
浏览 522回答 3
3回答

呼啦一阵风

从标准通道 12-特殊成员功能参数12.8 复制和移动类对象(重点是我的)9。如果类X的定义未明确声明移动构造函数,则仅当且仅当将隐式声明为默认构造函数。— X没有用户声明的副本构造函数,— X没有用户声明的副本分配运算符,— X没有用户声明的移动分配运算符,并且— X没有用户声明的析构函数。[注意:当未隐式声明或未明确提供move构造函数时,原本会调用move构造函数的表达式可能会调用copy构造函数。—尾注]然后11说明删除默认移动构造函数的规则11。隐式声明的copy / move构造函数是其类的内联公共成员。如果X具有以下功能,则默认将类X的复制/移动构造函数定义为已删除(8.4.3):—具有非平凡的对应构造函数且X是类联合类的变体成员,—无法复制/移动的类类型为M(或其数组)的非静态数据成员,因为应用于M的相应构造函数的重载分辨率(13.3)导致歧义或从该类中删除或无法访问的函数默认的构造函数,—无法复制/移动的直接或虚拟基类B,因为将重载解析(13.3)应用于B的相应构造函数,会导致歧义或函数从默认构造函数中删除或无法访问,—具有从默认构造函数中删除或无法访问的带有析构函数的类型的任何直接或虚拟基类或非静态数据成员,或者,—对于复制构造函数,是rvalue引用类型的非静态数据成员。重载分辨率(13.3,13.4)将忽略定义为delete的默认move构造函数。[注意:否则,删除的move构造函数会干扰右值的初始化,而右值可以使用copy构造函数来代替。—尾注]关于这一切的复杂性*规则可能会有些压倒性。最好使用某种技术来绕过复杂性。例如:利用零规则简化大多数类的编写。(在隐式删除时)显式默认所讨论的特殊成员函数;如果将其隐式定义为Delete,则编译器将抱怨。*我本人(1)和dyp(2)在评论中指出的要点

撒科打诨

我不知道。我什至没有一个很好的猜测。我认为您提到的任何一种选择都是可能的。今天,最有可能的猜测是它们将永远不会被删除。如今,编译器甚至都不愿意默认情况下打开此不建议使用的警告。我正在尽我的一小部分努力通过教育扭转这一趋势。我认为最终通过任何选择删除都是一个好的方向。&nbsp;
随时随地看视频慕课网APP
我要回答