簡體   English   中英

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

[英]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::stringconst 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM