[英]Why does this code compile? cout < “tt”;
cout
是類ostream
對象, ostream
是basic_ostream
typedef:
extern ostream cout;
typedef basic_ostream<char> ostream;
template <class charT, class traits = char_traits<charT> >
class basic_ostream;
但這些類都沒有operator<
所以我無法理解為什么這段代碼編譯沒有任何錯誤:
std::cout < "aaa";
在C ++語言中,運算符<
使編譯器考慮表單的內置候選函數
bool operator<(T, T);
對於每個可能的指針類型T
特別是,這意味着void *
類型具有這樣的功能。 這是適用於您的情況的功能。 字符串文字可以隱式轉換為void *
而std::cout
也可以隱式轉換為void *
。
您可以使用以下極簡主義示例重現相同的行為
struct X {
operator void *() { return 0; }
};
int main() {
X() < "";
}
以上內容適用於C ++ 03。 我不確定為什么它在C + 11中編譯很難(假設它確實如此),因為在C ++ 11中,流轉換為void *
被顯式轉換為bool
所取代。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.