=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 中创建自己的复制构造函数。如果您对此表示满意,那么这就是您所需要的。