Какая разница между cout << cout и cout << & cout в С++?

Это может быть начальный вопрос, и понимание того, как работает cout, возможно, имеет ключевое значение. Если бы кто-то мог ссылаться на хорошее объяснение, это было бы здорово. cout<<cout и cout<<&cout печатать шестнадцатеричные значения, разделенные 4 на машине Linux x86.

Ответ 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 в поток.