派生类在基类中被删除时是否会有隐式复制构造函数或赋值运算符?
Qt定义Q_DISABLE_COPY如下:
#define Q_DISABLE_COPY(Class)
Class(const Class &) = delete;
Class &operator=(const Class &) = delete;
Q_DISABLE_COPY是在使用QObject类,但它的文件说,它应该在其所有的子类可以作为很好:
当你创建自己的子类的QObject(董事或间接的),你应该不给它一个拷贝构造函数或赋值操作符。然而,简单地从类中省略它们可能还不够,因为如果您错误地编写了一些需要复制构造函数或赋值运算符的代码(这很容易做到),您的编译器会为您精心创建。你必须做得更多。
但是考虑这个程序:
struct Base {
Base() = default;
private:
Base(const Base &) = delete;
Base &operator=(const Base &) = delete;
};
struct Derived : Base {};
int main() {
Derived d1;
Derived d2(d1); // error: call to implicitly-deleted copy constructor of 'Derived'
Derived d3;
d3 = d1; // error: object of type 'Derived' cannot be assigned because its copy assignment operator is implicitly deleted
}
试图编译该程序的错误似乎表明编译器不会在派生类中创建复制构造函数或赋值运算符,当它们在基类中被删除时。Qt 的文档在这方面是错误的,还是在创建它们时有一些边缘情况?
相关,但不重复:在 QObject 派生类中重复 Q_DISABLE_COPY。它给出了为什么Q_DISABLE_COPY在类中使用它可能有用的原因,即使它无论如何都不可复制,但并不能确认没有它它实际上永远不会被复制。