可使用=delete语法显式删除C++类中特定构造函数以禁止不安全调用:一、禁用默认/拷贝构造及赋值;二、封禁隐式转换构造(如double);三、删除模板构造的特定实例(如std::string);四、禁用移动语义中的特定重载(如const char*);五、在派生类中屏蔽基类构造函数。

如果您希望在 C++ 类中明确禁止某些构造函数被调用,防止意外的隐式转换或不安全的对象构造,则可以利用 = delete 语法对特定构造函数进行显式删除。以下是实现该目标的多种技术路径:
一、禁用默认构造函数与拷贝构造函数
通过将默认构造函数和拷贝构造函数标记为 = delete,可强制要求用户必须提供参数化构造,并阻止对象被复制。这种写法常用于资源独占类(如文件句柄、互斥锁)的设计中。
1、在类定义内部,将默认构造函数声明为 MyClass() = delete;。
2、将拷贝构造函数声明为 MyClass(const MyClass&) = delete;。
立即学习“C++免费学习笔记(深入)”;
3、将拷贝赋值运算符也声明为 MyClass& operator=(const MyClass&) = delete;。
二、禁用隐式类型转换构造函数
当类提供单参数构造函数时,编译器可能执行隐式转换,导致非预期行为。使用 = delete 可选择性地封禁特定参数类型的构造路径,同时保留其他合法构造方式。
1、定义一个接受 int 的构造函数:MyClass(int) {}。
2、显式删除 double 类型的构造重载:MyClass(double) = delete;。
3、尝试以 3.14 初始化对象时,编译器将报错,而 42 仍可成功构造。
三、禁用模板构造函数的特定实例化
对于泛型构造函数(如模板构造),可通过 = delete 删除不期望的具体类型实例,避免歧义或低效构造。该方法依赖于 SFINAE 失败前的精确匹配控制。
1、声明模板构造函数:template
2、特化删除 std::string 实例:MyClass(std::string) = delete;。
3、确保该删除声明位于模板定义之后、且在同一作用域内,否则无法覆盖模板匹配。
四、禁用移动语义中的特定重载
在支持移动语义的类中,有时需阻止某类右值引用的构造(例如禁止从临时字符串字面量构造),此时可在移动构造函数上应用 = delete,而不影响其他移动操作。
1、定义移动构造函数:MyClass(MyClass&&) noexcept;。
2、额外声明并删除 const char* 移动构造:MyClass(const char*&&) = delete;。
3、该删除仅作用于字面量字符串右值,不影响 std::move(obj) 形式的合法移动。
五、跨继承层级的构造函数禁用
在派生类中,可通过 = delete 显式屏蔽基类提供的某些构造函数,即使基类未将其设为私有或保护。这能有效限制派生类对象的构造入口点。
1、定义基类 Base 并提供公有 Base(int) 构造函数。
2、在派生类 Derived 中声明:Derived(int) = delete;。
3、此时 Derived d(42); 编译失败,但 Derived d(Base(42)); 仍可能合法(若未禁用相应构造)。


















