我有一個方法:爲什麼我可以將一個「C字符串」傳遞給期望std :: string的函數?
void Foo::Bar(const std::string &str)
{
printf("%d", str.length());
}
當我做
foo.Bar("hello");
我以爲"hello"
是const char *
,而不是一個std::string
它無縫工作?
我有一個方法:爲什麼我可以將一個「C字符串」傳遞給期望std :: string的函數?
void Foo::Bar(const std::string &str)
{
printf("%d", str.length());
}
當我做
foo.Bar("hello");
我以爲"hello"
是const char *
,而不是一個std::string
它無縫工作?
有兩種方式的用戶定義類型可以隱式轉換:
任何僅使用一個參數且不使用關鍵字「explicit」的構造函數都會定義一個隱式轉換(從參數的類型到正在構造的對象的類型)。標準字符串類有意不使用「顯式」來提供此轉換的便利。
因爲std :: string的構造函數需要const char *
,C++會自動爲你構造一個臨時的字符串對象。
從技術上講,這是一個char const[6]
但是,你應該能夠做到這一點,這要歸功於隱式轉換和std::string
構造函數之一。
因爲有一個?隱式?使用std::string(char *)
構造函數從char *
轉換爲std::string
。
與您的問題有些相關:如果您在C++中有一段時間,您* 明確 * ly不希望編譯器像這樣改變類型,當兼容構造函數存在時,使用關鍵字「顯式「構造函數之前。然後它會給你一個編譯器錯誤。但是,您只能使用您創建的類型來執行此操作。不適用於像字符串的STL類型。
您的字符串文字是char const[6]
。
它的名稱衰減到const char*
傳遞給函數。
然後,執行隱式轉換,因爲:
rvalue
可以綁定到它const char*
可以隱式轉換成std::string
rvalue
。
重要的是,_non-explicit_構造函數。 – ildjarn