C++ 中 class 层次结构中的每个 class 是否会独立处理隐式定义的成员函数的生成?
Does generation of implicitly defined member functions get handled independently for every class in a class hierarchy in C++?
用户定义的“Rule of 5”函数(析构函数、复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符)在特定 class 中的存在是否影响这些函数将在其派生或基础 classes 中生成?如果是,是什么方式?
换句话说,如果我试图确定将为特定 class 隐式生成哪些函数,我是否需要有关它的父项或子项的信息 classes?
可选问题:这些函数之一在特定 class 中的存在是否会影响其他 classes 的隐式生成函数的生成代码在层次结构中?如果是,是什么方式?
编译器将始终为没有用户声明的析构函数的 class C
声明析构函数 (C++17 [class.dtor]/4)。但是,如果 C
的任何基 class 具有已删除或不可访问的构造函数,则 C
的析构函数也将被声明为已删除(p5)。
类似的语句适用于复制构造函数 ([class.copy.ctor]/6) 和复制赋值运算符 ([class.copy.assign]/2)。
在移动构造函数的情况下,如果用户没有声明 any 规则,编译器只会隐式声明它为 class C
C
([class.copy.ctor]/8) 的 5 个函数。 C
的基classes会影响C
的移动构造函数是否删除,但不影响编译器是否生成声明。类似的语句适用于移动赋值运算符 ([class.copy.assign]/4).
用户定义的“Rule of 5”函数(析构函数、复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符)在特定 class 中的存在是否影响这些函数将在其派生或基础 classes 中生成?如果是,是什么方式?
换句话说,如果我试图确定将为特定 class 隐式生成哪些函数,我是否需要有关它的父项或子项的信息 classes?
可选问题:这些函数之一在特定 class 中的存在是否会影响其他 classes 的隐式生成函数的生成代码在层次结构中?如果是,是什么方式?
编译器将始终为没有用户声明的析构函数的 class C
声明析构函数 (C++17 [class.dtor]/4)。但是,如果 C
的任何基 class 具有已删除或不可访问的构造函数,则 C
的析构函数也将被声明为已删除(p5)。
类似的语句适用于复制构造函数 ([class.copy.ctor]/6) 和复制赋值运算符 ([class.copy.assign]/2)。
在移动构造函数的情况下,如果用户没有声明 any 规则,编译器只会隐式声明它为 class C
C
([class.copy.ctor]/8) 的 5 个函数。 C
的基classes会影响C
的移动构造函数是否删除,但不影响编译器是否生成声明。类似的语句适用于移动赋值运算符 ([class.copy.assign]/4).