В чем разница между cout << cout и cout << & cout в c ++? - PullRequest
8 голосов
/ 20 сентября 2011

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

Ответы [ 5 ]

16 голосов
/ 20 сентября 2011

cout << cout эквивалентно cout << cout.operator void *().Эта идиома использовалась до C ++ 11 для определения того, находится ли iostream в состоянии сбоя и реализован ли в std::ios_base;обычно он возвращает адрес static_cast<std::ios_base *>(&cout).

cout << &cout печатает адрес cout.

Поскольку std::ios_base является виртуальным базовым классом cout, он не обязательно может быть смежным с cout.Вот почему он печатает другой адрес.

5 голосов
/ 20 сентября 2011

cout << cout использует встроенное преобразование в void*, которое существует для логических целей тестирования. По какой-то неинтересной причине ваша реализация использует 4-байтовый адрес объекта std::cout. В C ++ 11 это преобразование было удалено, и это не должно компилироваться.

cout << &cout печатает адрес объекта std::cout.

4 голосов
/ 20 сентября 2011

cout << &cout передает cout адрес cout.

cout << cout печатает значение неявного приведения cout к указателю void*, используя его operator void*.

3 голосов
/ 20 сентября 2011

Как уже говорилось, cout << cout использует преобразование void*, предусмотренное для тестирования bool (while (some_stream){ ... } и т. Д.)

Он печатает значение & cout + 4, потому что преобразование выполняется в базовой реализации, и приводит к его собственному типу, это из libstdc ++ :

operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
0 голосов
/ 20 сентября 2011

cout<<&cout передает адрес cout в поток.

...