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<<cout and cout<<&cout print hex values separated by 4 on a linux x86 machine.
- 181,601
- 45
- 354
- 430
- 327
- 2
- 6
-
Here is an example for people. http://ideone.com/0FZXZ – Daniel A. White Sep 20 '11 at 17:21
-
1What actually *is* the question? – Puppy Sep 20 '11 at 17:21
-
3Why are you asking this. The question does not make any sense their is no logic in doing that. – Martin York Sep 20 '11 at 17:25
-
@Tux-D: Why I asked it: I saw this idiom somewhere and it confused me. I understood why cout< – byslexia Sep 20 '11 at 20:06
-
@DanielA.White: Nothing there. – sergiol Jun 01 '17 at 15:25
5 Answers
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.
- 51,558
- 7
- 73
- 102
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.
- 219,040
- 71
- 423
- 503
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*.
- 41,431
- 11
- 106
- 104
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); }
- 23,686
- 11
- 78
- 128