我刚刚读过初学者书上的重载函数。 出于好奇,我想问一下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;
}
答案 0 :(得分:7)
是的,它是安全的,只要你做到const char*
,并且实际上经常有用。自C ++ 11以来,字符串文字无法转换为char*
(之前已弃用)。
将为字符串文字挑选const char*
重载,因为字符串文字是const char[N]
(其中N
是字符数)。重载具有一种优先级排序,当多个工作时,将对其进行选择。与构造std::string
相比,它被认为是执行数组到指针转换的更好匹配。
为什么重载std::string
和const 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);