![](/img/trans.png)
[英]Why is this C++ expression involving overloaded operators and implicit conversions ambiguous?
[英]C++ implicit conversions in operands to standard operators
我在理解C ++使用隱式轉換的條件時遇到了一些麻煩。 假設我有一個班級:
class SomeClass
{
private:
int val;
public:
SomeClass(int i) :val{ i } {}
operator string() { return to_string(val); }
};
為什么在將此類與運算符一起使用時需要轉換為字符串? 為什么不隱式執行轉換呢?
碼:
int main(void)
{
SomeClass sc = 4;
cout << (string)sc << endl; //prints 4, compiles fine
cout << sc << endl;//does not compile, no operator "<<" matches these operands
string str1 = sc;//compiles fine, performs cast
string str2 = "Base String" + sc;//does not compile, no operator "+" matches these operands
}
這個問題更具學術性而非實際性,因為無論如何使用演員表更具可讀性。
std::cout
不接受std::string
。
它接受一個模板化的std::basic_string
,其參數將被推導出來。
有關詳細信息,請參見此處
讓我們考慮以下示例:
#include<string>
struct SomeClass {
operator std::string() { return ""; }
};
template <class CharT, class Traits, class Allocator>
void f(const std::basic_string<CharT, Traits, Allocator> &) {}
template <class CharT, class Traits, class Allocator>
void f(std::basic_string<CharT, Traits, Allocator> &) {}
int main(void) {
SomeClass sc{};
f((std::string)sc);
//f(sc);
}
它類似於你的情況。
當然, f(sc)
不會因為幾乎相同的原因而編譯。
問題是推導出模板參數SomeClass
應該轉換為std::string
。 為了能夠將其轉換為std::string
,編譯器應該猜測存在有效的重載並嘗試使用它。 無論如何,從它的角度來看,這樣一個可行的函數是不存在的,因為仍然需要推導出模板參數並推導它們,編譯器應該猜測在轉換后SomeClass
的重載是存在的。 它不能,因為......等等。
我沒有檢查過,但我敢打賭類似的東西也適用於operator+
。
編寫cout << (string)sc
時使用的operator<<
overload是一個函數模板:
template <class CharT, class Traits, class Allocator> std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const std::basic_string<CharT, Traits, Allocator>& str);
這是因為std::string
本身是一個類模板,並且可以使用除char
之外的其他類型進行實例化,並且如果將字符寫入相同字符類型的流,則仍應該是可打印的。 實際上,這正是std::wstring
所發生的情況,其中CharT
是wchar_t
而不是char
。 如果您使用合適的流,那么同一個operator<<
可以工作。
當你編寫cout << sc
,會考慮特定的重載。 然后拒絕該重載,因為編譯器無法推斷出哪種類型用於CharT
和其他CharT
。 如果它已經知道轉換將被執行,它只能推斷出類型,但轉換不僅僅被考慮,它們只會在稍后的階段進行檢查。
如果有一個非模板operator<<
overload,它帶有std::string
,那么它就可以工作, sc
會被隱式轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.