This might be a beginner question and understanding how cout works is probably key here. If somebody could link to a good explanation, it would be great.
cout<
As already stated, cout << cout
uses the void*
conversion provided for bool testing (while (some_stream){ ... }
, etc.)
It prints the value &cout + 4 because the conversion is done in the base implementation, and casts to its own type, this is from libstdc++:
operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
cout << &cout
is passing cout
the address of cout
.
cout << cout
is printing the value of implicitly casting cout
to a void*
pointer using its operator void*
.
cout << cout
is using the built-in conversion to void*
that exists for boolean test purposes. For some uninteresting reason your implementation uses an address that is 4 bytes into the std::cout
object. In C++11 this conversion was removed, and this should not compile.
cout << &cout
is printing the address of the std::cout
object.
cout << cout
is equivalent to cout << cout.operator void *()
. This is the idiom used before C++11 to determine if an iostream is in a failure state, and is implemented in std::ios_base
; it usually returns the address of static_cast<std::ios_base *>(&cout)
.
cout << &cout
prints out the address of cout
.
Since std::ios_base
is a virtual base class of cout
, it may not necessarily be contiguous with cout
. That is why it prints a different address.
cout<<&cout
is passing the address of cout
to the stream.