Это может быть начальный вопрос, и понимание того, как работает 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
в поток.