Sté*_*ane 1 c++ implicit-conversion
类似的问题之前已经被问过,例如String 文字匹配 bool 重载而不是 std::string。
但我想知道的是,C++ 开发人员应该怎样做才能防止这种情况发生?作为编写 C++ 库供其他人使用的人,我应该怎么做才能确保这种情况不会发生?这是我今天遇到的示例,其中一个库有 2 个initialize()方法:
void initialize(bool someflag) { /* ... */ }
void initialize(const std::string & name) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
现在有问题的代码位于想要利用此功能的应用程序中,并且以类似于以下的方式调用它:
initialize("robert");
Run Code Online (Sandbox Code Playgroud)
乍一看,您可能会认为这会调用initialize(string),但实际上它调用的是第一个initialize(bool),并将布尔标志设置为 true!
是的,我知道可以用以下方法解决:
initialize( std::string("robert") );
Run Code Online (Sandbox Code Playgroud)
但这让调用者承担了责任。
编辑@zdan:我不认为其他链接问题中的“解决方案”是很好的解决方案,因为1)我希望不必添加const char *采用布尔或字符串的每个方法的版本,2)模板解决方案显着提高了受影响方法的代码可维护性,使它们几乎不可读。
我应该怎么做才能确保这种情况不会发生?
一种可能性是创建一个接受 a 的重载char const*,并使其传递到接受 a 的重载std::string。
void initialize(char const* name) { initialize(std::string(name)); }
Run Code Online (Sandbox Code Playgroud)