关于特殊成员(默认构造函数、析构函数、复制和移动),= default
和= delete
受到了很多关注。 = default
和 = delete
可以和其他函数一起使用吗?成员函数、自由函数和运算符等?
我可以理解 = default
可能不允许在特殊成员之外;因为它基本上是说使用编译器生成的默认值。在编译器能够生成默认值之前,需要明确定义默认值。据我所知,只有特殊成员才有这些预定义的默认值。
那= delete
呢?它基本上是说声明了函数,但未明确定义实现。
= delete
可以与特殊成员以外的函数一起使用吗?- 它可以用于哪些函数类型(成员、非成员、运算符等)?
- 或者相反,在什么地方(或什么时候)禁止使用
= delete
?它的使用有什么限制吗?
最佳答案
任何函数都可以声明为已删除(使用 = delete
)。该标准不施加任何限制。 C++11[dcl.fct.def.delete] 涵盖了这一点。它甚至给出了一个已删除的 operator new
的示例。
另一方面,默认函数受到 [dcl.fct.def.default]§1 的限制,如下所示:
1 ... A function that is explicitly defaulted shall
- be a special member function,
- have the same declared function type (except for possibly differing ref-qualifiers and except that in the case of a copy constructor or copy assignment operator, the parameter type may be “reference to non-const
T
”, whereT
is the name of the member function’s class) as if it had been implicitly declared, and- not have default arguments.
第一个要点中引用的“特殊成员函数”是(根据[特殊]§1):
- 默认构造函数
- 拷贝构造函数
- 移动构造函数
- 复制赋值运算符
- 移动赋值运算符
- 析构函数
关于c++ - 可以删除(或默认)非特殊 C++ 成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24676081/