cout
- объект класса ostream
, а ostream
- typedef basic_ostream
:
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. Я не уверен, почему он компилируется в С++ 11 (если это так), поскольку в C++ 11 преобразование потока в void *
было заменено явным преобразованием в bool
.
void *
one, поэтому он запускает неопределенное поведение, так как указатели не связаны.