C++11引入的=delete
是一种特性,它用于明确禁用或删除类的成员函数、特殊成员函数、或者其他成员函数。=delete
的主要目的是在编译时捕获潜在的错误,并提供更精确的控制,以确保类的行为符合设计要求
禁用默认函数:
使用=delete
可以禁用类的默认构造函数、复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符或析构函数。这对于防止特定的操作非常有用,例如禁止对象的复制或禁止析构函数的调用。
class NonCopyable { public: NonCopyable() = default; // 使用=delete禁止复制构造函数和复制赋值运算符 NonCopyable(const NonCopyable&) = delete; NonCopyable& operator=(const NonCopyable&) = delete; };
防止意外重载:
使用=delete
还可以防止意外的函数重载。当有多个重载版本的函数时,有时会出现参数类型非常相似的情况,可能会导致调用时的二义性。通过使用=delete
可以明确禁用某些重载,以避免二义性错误。
#include <iostream> void myFunction(int a) { std::cout<<a<<std::endl; } void myFunction(double) = delete; // 使用=delete禁止double类型的重载 int main() { myFunction(42); // 调用int版本 // myFunction(3.14); // 无法编译,double版本已被删除 return 0; }
更好的错误提示:
当使用=delete
时,编译器会在出现违反删除约束的情况下生成更明确的错误消息,这有助于更快地识别和修复问题。
提高代码清晰性:
使用=delete
可以使代码更加清晰,因为它明确表达了某些操作是被禁用的,而不是由于编译器的默认行为
=delete使用范围:
- 只能用于成员函数或全局函数:
=delete
只能用于类的成员函数、全局函数或者重载操作符,不能用于局部变量、局部函数或类的数据成员。 - 不能用于默认函数参数: 不能在函数的默认参数上使用
=delete
。 - 不能用于虚函数: 不能使用
=delete
来删除虚函数,虚函数应该使用纯虚函数(virtual void func() = 0;
)来声明。 - 不能用于非特殊成员函数的重载:
=delete
不能用于非特殊成员函数的重载,例如,你不能使用=delete
来删除一个普通成员函数,只能用于特殊成员函数,如构造函数、复制构造函数等。 - 类型相关性: 删除的函数必须与实际调用匹配,否则编译器可能会产生不一致的行为。
- 友元函数: 友元函数通常不受
=delete
影响,因为它们不属于类的成员函数。