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

3 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;

}
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 7

是的,它是安全的,只要你做到了const char*,实际上通常很有用.字符串文字无法转换为char*自C++ 11以来(之前已弃用).

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

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