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";
答案 0 :(得分:2)
在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 *
被显式转换为{{1} }。