私は、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++ プログラムとして、文字列リテラル ( ) が std::string である場合、なぜstd::string のままでマッチングするのではなく"ambiguous"
、a にキャストされてからchar*
関数に一致するのでしょうか?hello(char* c)
hello(std::string s)
警告をプラグマ化または -Wsomething できることはわかっています (そして、心配することなく char* を文字列にキャストできます) が、なぜコンパイラがわざわざこのキャストを行うのか、またそうしないように指示する方法があるかどうかを知りたいです。 . g++ 4.4.3 でコンパイルしています。
ありがとうございました。