我正在编写一个程序,它应该同时处理 c 字符串(char*)和 c++ 字符串(std::string)。我对下面的例子感到担忧。
#include <iostream>
#include <string>
void hello(std::string s) {
std::cout << "STRING FUNCTION" << std::endl;
}
void hello(char* c) {
std::cout << "CHAR FUNCTION" << std::endl;
}
int main(int argc, char* argv[]) {
hello("ambiguous");
hello((std::string)"string");
hello((char*)"charp");
return 0;
}
当我编译这个程序时,我收到警告:
test.cpp:14: warning: deprecated conversion from string constant to ‘char*’
关于第一次调用hello
. 运行程序给出:
CHAR FUNCTION
STRING FUNCTION
CHAR FUNCTION
显示第一次调用hello
与签名匹配hello(char* c)
。
我的问题是,如果作为 c++ 程序,字符串文字 ( "ambiguous"
) 是 std::string,为什么将它转换为 achar*
然后匹配函数hello(char* c)
而不是保持为 std::string 和匹配hello(std::string s)
?
我知道我可以 pragma 或 -Wsomething 发出警告(并且我可以将 char* 转换为字符串而无需担心),但我想知道为什么编译器甚至会费心进行这种转换,以及是否有办法告诉它不要. 我正在使用 g++ 4.4.3 进行编译。
谢谢你。