重载char *和std :: string是否安全?

时间:2014-07-09 19:27:26

标签: c++

我刚刚读过初学者书上的重载函数。 出于好奇,我想问一下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;

}

2 个答案:

答案 0 :(得分:7)

是的,它是安全的,只要你做到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重载。

答案 1 :(得分:0)

简答:完全安全。考虑以下用途:

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( “条”); 你需要这个:     void foo(const char * bar);