混沌 IN C++::轉換函式
難度:
問題:
下面這段程式碼為什麼會編譯失敗呢?
struct T
{
operator std::string() const
{
return std::string();
}
operator int() const
{
return int();
}
};
int main()
{
T t;
int i = t;
std::string s = t;
i == t; //成功
s == t; //失敗
}
回答:
因為標準庫沒有提供bool operator==(const std::string&, const std::string&);這樣的過載,而是提供了
template<typename CharT, typename Traits, typename Alloc>
bool operator==(const std::basic_string<CharT, Traits, Alloc>&, const std::basic_string<CharT, Traits, Alloc>&);
當s == t 進行比較的時候,編譯器用第一個引數s可以推匯出CharT, Traits, Alloc這三個模板引數,然後用t來推導,結果是無法完成推導,因為t並不是basic_string<>。那T中的operator std::string() const的轉換函式在這裡有什麼作用呢?事實上,這個轉換函式在這裡一點用也沒有,C++沒有提供一個規則是先轉換再推導函式模板引數的。解決這個問題的辦法,就是讓編譯器在推導第二個引數的型別之前,顯式地將t轉換為std::string。
s == std::string(t);
到這一步,有人又會納悶,basic_string也沒提供basic_string(const std::string&)的建構函式啊,而是提供的
template<typename CharT, typename Traits, typename Alloc>
basic_string(const basic_string<CharT, Traits, Alloc>&);
按照上面的說法,那顯式轉換std::string(t)是怎麼完成推導函式模板引數的呢? 其實std::string並不是類别範本了,而是被例項化成basic_string<char>這個模板類,std::string(t)也沒有進行推導,因為已經明確了CharT, Traits, Alloc這三個模板引數,所以這時的operator std::string() const起作用了。
相關文章
- C++型別轉換建構函式C++型別函式
- 【C++】禁止隱式轉換C++
- 8.轉換文字函式函式
- Oracle OCP(05):轉換函式Oracle函式
- C++ 表示式中的型別轉換C++型別
- GaussDB: db2->gaussdb 函式轉換DB2函式
- python函式每日一講 - float函式型別轉換詳解Python函式型別
- c++ static_cast顯式型別轉換C++AST型別
- c++隱式型別轉換存在的陷阱C++型別
- C++函式C++函式
- sql server 資料型別轉換函式SQLServer資料型別函式
- 函式匹配和實參型別轉換函式型別
- 將數值轉換為字串的函式字串函式
- 建構函式定義的隱式型別轉換函式型別
- 徹底理解c++的隱式型別轉換C++型別
- 將你的Gradle依賴轉換為函式Gradle函式
- c++ Beep函式C++函式
- c++函式模板C++函式
- js顯式轉換和隱式轉換JS
- C++ 建構函式和解構函式C++函式
- 【C++】C++之型別轉換C++型別
- c++ 型別轉換C++型別
- C++四種顯式型別轉換操作符C++型別
- 神經網路啟用函式=生物轉換器?神經網路函式
- EXCEL中日期格式轉換為文字格式-函式TEXTExcel函式
- C++中函式指標與函式物件C++函式指標物件
- scala簡明教程:偏函式、高階函式、Future非同步程式設計、隱式轉換函式非同步程式設計
- Django筆記二十四之資料庫函式之比較和轉換函式Django筆記資料庫函式
- c++ 函式指標C++函式指標
- 函式回撥(C++)函式C++
- c++的remove函式C++REM函式
- C++之memset函式C++函式
- C++解構函式C++函式
- C++ replace() 函式用法C++函式
- C++中strlen函式C++函式
- C++靜態函式C++函式
- C++(函式指標)C++函式指標
- C++函式模板案例C++函式
- C++ 序列操作函式C++函式