<QtClassHelperMacros> 代理页面

Q_DISABLE_COPY(Class)
Q_DISABLE_COPY_MOVE(Class)
(since 6.9) Q_DISABLE_COPY_MOVE_X(Class, reason)
(since 6.9) Q_DISABLE_COPY_X(Class, reason)

宏文档

Q_DISABLE_COPY(Class)

禁用给定Class 的复制构造函数和赋值操作符。

QObject 子类的实例不应被视为可以复制或赋值的值,而应被视为唯一标识。这意味着,当您创建自己的QObject 子类(直接或间接)时,不应给它使用拷贝构造函数或赋值操作符。不过,仅仅从类中省略它们可能还不够,因为如果你错误地编写了一些需要复制构造函数或赋值操作符的代码(这很容易做到),编译器会很贴心地为你创建它们。你必须做更多。

好奇的用户会发现,从QObject 派生的 Qt 类通常会在私有部分包含这个宏:

class MyClass : public QObject
{
private:
    Q_DISABLE_COPY(MyClass)
};

它在私有部分声明了一个复制构造函数和一个赋值操作符,这样如果您错误地使用了它们,编译器就会报错。

class MyClass : public QObject
{
private:
    MyClass(const MyClass &) = delete;
    MyClass &operator=(const MyClass &) = delete;
};

但即便如此,也不一定能捕捉到所有情况。你可能会想这样做:

首先,不要这样做。大多数编译器会生成使用复制构造函数的代码,因此会报告侵犯隐私的错误,但 C++ 编译器并不要求以特定的方式生成该语句的代码。编译器可以生成既不使用复制构造函数也不使用赋值操作符的代码。在这种情况下,不会有错误报告,但在调用w 的成员函数时,应用程序可能会崩溃。

另请参见 Q_DISABLE_COPY_MOVEQ_DISABLE_COPY_X

Q_DISABLE_COPY_MOVE(Class)

这是一个方便使用的宏,用于禁用给定Class 的复制构造函数、赋值运算符、移动构造函数和移动赋值运算符。

另请参见 Q_DISABLE_COPYQ_DISABLE_COPY_MOVE_X

[since 6.9] Q_DISABLE_COPY_MOVE_X(Class, reason)

Q_DISABLE_COPY_MOVE 一样,该宏禁用了类Class 的复制和移动操作。

此外,它还记录了reason 该类不支持复制/移动操作的原因。在 C++26 中,这将导致编译器在错误信息中报告任何尝试这些不支持操作的代码的原因。

此宏在 Qt 6.9 中引入。

另请参见 Q_DISABLE_COPY_XQ_DECL_EQ_DELETE_X

[since 6.9] Q_DISABLE_COPY_X(Class, reason)

Q_DISABLE_COPY 类似,该宏禁用了类Class 的复制操作。

此外,它还记录了reason 该类不支持复制操作的原因。在 C++26 中,这将导致编译器在错误信息中报告任何尝试这些不支持操作的代码的原因。

此宏在 Qt 6.9 中引入。

另请参见 Q_DISABLE_COPY,Q_DISABLE_COPY_MOVE_X, 和Q_DECL_EQ_DELETE_X

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.