[英]Is it safe to overload char* and std::string?
我剛剛讀過初學者書中的重載函數。 出於好奇,我想問一下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;
}
是的,它是安全的,只要你使它成為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
重載。
簡答:完全安全。 考慮以下用途:
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(“bar”); 你需要這個:void foo(const char * bar);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.