Почему этот код компилируется? cout <«tt»;

0

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";
  • 4
    en.cppreference.com/w/cpp/io/basic_ios/operator_bool - и, судя по его компиляции, он использует void * one, поэтому он запускает неопределенное поведение, так как указатели не связаны.
  • 0
    @omid Точно так же, как вы понимаете комментарий выше, вы используете «<», что означает «проверка на меньшее», а не «<<», которое выводится.
Показать ещё 3 комментария
Теги:
stl
ostream
cout

1 ответ

2
Лучший ответ

В 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.

  • 0
    Я на 99% уверен, что это просто догоняющие реализации стандартной библиотеки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню