重载char*和std::string安全吗?



我刚刚在一本初学者的书中读到了重载函数。出于好奇,我想问一下在char*和std::string之间重载是否安全。

我使用下面的代码并得到一些结果。但我不确定这是否是一种未定义的行为。

void foo(std::string str) {
  cout << "This is the std::string version. " << endl;
}
void foo(char* str) {
  cout << "This is the char* version. " << endl;
}
int main(int argc, char *argv[]) {
  foo("Hello"); // result shows char* version is invoked
  std::string s = "Hello";
  foo(s); // result shows std::string version
  return 0;
}

是的,它是安全的,只要你把它做成const char*,而且实际上经常有用。自c++ 11起,字符串字面值不能转换为char*(在此之前已弃用)。

将为字符串字面值选择const char*过载,因为字符串字面值是const char[N](其中N是字符数)。重载有一种优先级排序,当多个重载都可以工作时,将选择哪个重载。它被认为是执行数组到指针转换比构造std::string更好的匹配。

为什么重载std::stringconst char*是有用的?例如,如果您有一个std::string和一个bool的重载,那么当您传递字符串字面量时,bool将被调用。这是因为bool重载仍然被认为是比构造std::string更好的匹配。我们可以通过提供const char*过载来解决这个问题,它将击败bool过载,并且可以转发到std::string过载。

简短的回答:绝对安全。考虑以下用法:

foo("bar");//uses c string 
foo(std::string("bar") );//uses std::string
char* bar = "bar";
foo(bar);//uses c string
std::string bar_string = "bar";
foo(bar_string);//uses std::string
foo(bar_string.c_str()); //uses c string

需要注意的是,有些编译器(即启用了c++11的编译器)需要在形参规范中使用const关键字,以便允许使用临时字符串。

例如,为了得到这个:foo("酒吧");你需要这个:

相关内容

最新更新