Это может быть начальный вопрос, и понимание того, как работает cout, возможно, имеет ключевое значение. Если бы кто-то мог ссылаться на хорошее объяснение, это было бы здорово.
cout<<cout и cout<<&cout печатать шестнадцатеричные значения, разделенные 4 на машине Linux x86.
Какая разница между cout << cout и cout << & cout в С++?
Ответ 1
cout << cout эквивалентен cout << cout.operator void *(). Это идиома, используемая до С++ 11, чтобы определить, находится ли iostream в состоянии сбоя и реализован в std::ios_base; он обычно возвращает адрес static_cast<std::ios_base *>(&cout).
cout << &cout выводит адрес cout.
Так как std::ios_base является виртуальным базовым классом cout, он не обязательно должен быть смежным с cout. Вот почему он печатает другой адрес.
Ответ 2
cout << cout использует встроенное преобразование в void*, которое существует для логических целей тестирования. По какой-то неинтересной причине ваша реализация использует адрес, который составляет 4 байта в объекте std::cout. В С++ 11 это преобразование было удалено, и это не должно компилироваться.
cout << &cout печатает адрес объекта std::cout.
Ответ 3
cout << &cout передает cout адрес cout.
cout << cout печатает значение неявного литья cout в указатель void*, используя его operator void*.
Ответ 4
Как уже говорилось, cout << cout использует преобразование void*, предоставляемое для тестирования bool (while (some_stream){ ... } и т.д.)
Он печатает значение & cout + 4, потому что преобразование выполняется в базовой реализации и применяется к его собственному типу, это из libstdС++:
operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
Ответ 5
cout<<&cout передает адрес cout в поток.