代码之家  ›  专栏  ›  技术社区  ›  Elimination

五规则和隐式删除函数[重复]

  •  6
  • Elimination  · 技术社区  · 7 年前

    我想知道是否还有像上面提到的那样的场景。换句话说,在哪些情况下,用户定义的函数可以隐式删除其他函数?

    谢谢

    编辑:

    1 回复  |  直到 7 年前
        1
  •  4
  •   nyronium whaley    7 年前

    对于所有“五个”,该标准定义了在何种情况下它们将被隐含地宣布为删除。我已经为您命名并引用了C++标准中的相关章节 N4659 :

    • 构造函数(15.8)、移动构造函数(15.8)、复制赋值运算符(15.8)、移动赋值运算符(15.8), 或析构函数(15.4),则必须由用户提供union的相应成员函数,否则将 隐含删除了(11.4.3)的工会结束注释]

    • (15.1)“五”是在没有用户定义的替代方案时隐含声明的:

      默认构造函数(15.1)、复制构造函数和复制赋值运算符(15.8)、移动构造函数 移动赋值运算符(15.8)和析构函数(15.4)是 . [ 注: 这个 当程序运行时,实现将为某些类类型隐式声明这些成员函数 没有 . 如果使用odr,则实现将隐式定义它们(6.2)。见15.1, 结束注释 ]

    • 在以下情况下,类X的默认默认构造函数被定义为已删除:
      (5.1)X是一个具有变量成员和非平凡默认构造函数的并集,并且X的任何变量成员都没有默认成员初始值设定项,
      (5.2)X是一个非并集类,它具有具有非平凡默认构造函数的变量成员M,并且包含M的匿名并集的变量成员没有默认成员初始值设定项,

      (5.4)没有大括号或等号初始值设定项的const限定类型(或其数组)的任何非变量非静态数据成员没有用户提供的默认构造函数,
      (5.5)X是一个并集,其所有变体成员均为常量限定类型(或其数组),
      (5.6)X是一个非并集类,任何匿名并集成员的所有成员都是常量限定类型(或其数组),
      (5.7)任何潜在构造的子对象(具有大括号或相等初始值设定项的非静态数据成员除外)具有类类型M(或其数组),并且M没有默认构造函数或重载分辨率(16.3),用于查找M s相应构造函数会导致歧义或从默认默认构造函数中删除或无法访问的函数,或者

    • (15.8.1.10)隐式删除复制/移动构造函数:

      如果X具有以下条件,则类X的默认复制/移动构造函数定义为已删除(11.4.3):

      (10.2)无法复制/移动的潜在构造子对象类型M(或其数组),因为用于查找M s对应构造函数的重载分辨率(16.3)会导致歧义或从默认构造函数中删除或无法访问的函数,
      (10.3)具有析构函数的类型的任何潜在构造子对象,该析构函数从默认构造函数中删除或无法访问,或,

    • (15.8.2)隐式删除复制/移动赋值运算符:

      如果X具有以下情况,则类X的默认复制/移动赋值运算符定义为已删除:


      (7.3)参考类型的非静态数据成员,或
      (7.4)类类型M(或其数组)的直接非静态数据成员或无法复制/移动的直接基类M,因为用于查找M s相应赋值运算符的重载分辨率(16.3)会导致歧义或从默认赋值运算符中删除或无法访问的函数。

    • (15.4.5)隐式删除析构函数:

      在以下情况下,类X的默认析构函数定义为已删除:

      (5.2)任何潜在构造的子对象具有类类型M(或其数组),并且M具有已删除的析构函数或无法从默认析构函数访问的析构函数,