簡體   English   中英

C ++在操作數中對標准運算符的隱式轉換

[英]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所發生的情況,其中CharTwchar_t而不是char 如果您使用合適的流,那么同一個operator<<可以工作。

當你編寫cout << sc ,會考慮特定的重載。 然后拒絕該重載,因為編譯器無法推斷出哪種類型用於CharT和其他CharT 如果它已經知道轉換將被執行,它只能推斷出類型,但轉換不僅僅被考慮,它們只會在稍后的階段進行檢查。

如果有一個非模板operator<< overload,它帶有std::string ,那么它就可以工作, sc會被隱式轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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