=delete 函数的继承

Inheritance of =delete functions

假设我有一个名为 File 的 class。 我想为 File 的每个儿子禁用复制构造函数,例如 TextFile.

这样做会不会仍然禁用 TextFile 的复制构造函数?

class File {
public:
    File(const File& f) = delete;
};

class TextFile:public File {
public:
};

或者为了禁用此功能是否有必要?

class File {
public:
    File(const File& f) = delete;
};

class TextFile:public File {
public:
    TextFile(const TextFile& tf) = delete;
};

派生的复制构造函数class也在第一个代码片段中隐式删除。

来自 C++ 17 标准(15.8.1 Copy/move 构造函数)

10 An implicitly-declared copy/move constructor is an inline public member of its class. A defaulted copy/move constructor for a class X is defined as deleted (11.4.3) if X has:

(10.1) — a potentially constructed subobject type M (or array thereof) that cannot be copied/moved because overload resolution (16.3), as applied to find M’s corresponding constructor, results in an ambiguity or a function that is deleted or inaccessible from the defaulted constructor,

但是对于代码的自我记录,您可以在派生的 classes 中明确指定复制构造函数已被删除。

您只需要第一个代码块。由于 File 不可复制,因此当编译器为 TextFile 生成复制构造函数时,它将看到它并隐式删除它,因为它无法生成合法的复制构造函数。

但它不会阻止您在派生的 class 中创建自己的复制构造函数。如果您对此表示满意,那么这就是您所需要的。