为什么这段代码会编译? cout< “TT”;

时间:2014-02-19 21:50:11

标签: c++ stl cout ostream

cout是班级ostream的对象,ostreambasic_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";

1 个答案:

答案 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} }。