如何禁止函数参数的隐式构造以避免意外类型转换
禁止隐式转换,强制显式传入AClass实例
问题的核心在于AClass的std::string构造函数是隐式的,编译器会自动完成std::string到AClass的隐式转换,导致传入字符串时不会报错。要解决这个问题,只需要阻止这种隐式转换即可。
解决方案:将构造函数声明为explicit
在C++中,explicit关键字用于修饰单参数构造函数(或除第一个参数外其余参数都有默认值的多参数构造函数),它会禁止编译器进行隐式转换,只有显式调用构造函数时才会创建对象。
修改AClass的构造函数:
class AClass { public: // 保留其他构造函数 explicit AClass(const std::string& str); // 添加explicit关键字 };
效果验证
禁止的错误调用:此时直接传入
std::string或字符串字面量给AFunction,编译器会直接抛出编译错误,因为无法完成隐式转换:std::string s = "example"; AFunction(s); // 编译错误:无法将std::string隐式转换为AClass AFunction("example"); // 同样编译错误允许的合法调用:只有显式创建AClass实例时才能通过编译,符合需求:
// 方式1:先创建实例再传入 AClass a("example"); AFunction(a); // 方式2:显式构造临时对象传入 AFunction(AClass("example"));
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

