I was simply curious about what would happen if I called operator<< on std::cout explicitly because I learnt that a.operator() is exactly the same as a(). So I do it and it prints something weird:
#include <iostream>
using std::cout;
int main()
{
cout.operator<<("Hello World");
}
Output: 0x80486a0
Oddly, it outputs an address (the address may be different for you but it should still be an address). I’m thinking this is the address of the string so I try dereferencing it to get it to output the string:
*( cout.operator<<("Hello World") );
But I get a very long error
no match for operator* in '*std::cout.std::basic_ostream<...
I think this is pretty weird. Nothing of the std::cout definition would lead me to believe this would cause any different behavior; also given the fact that explicitly calling the operator function makes no difference (or should at least).
So why am I getting this output? Why am I receiving an address instead of the string itself when calling the operator explicitly? Is this even the address in memory or just garbage output? Any responses are appreciated.
The output operator for built-in strings, i.e., the on taking a
char const*as argument, isn’t a member ofstd::ostream. The operator taking achar const*is a non-member function would be called asThere is, however, a member taking a
void const*which formats the value of the pointer using hex notation. This member is the best match when passing any pointer explicitly to a memberoperator<< ()ofstd::ostream.Dereferencing the results of a the
operator<<()doesn’t work: The operators return astd::ostream&which doesn’t have a unaryoperator*()overloaded. If you meant to dereference the argument, you’d call it like so:However, this would just derference the
char const*the string literal decays to, yielding an individual characterH. The character output function isn’t a member function, either, while the output operators for integers are, i.e., it would print character value ofH. For a system using ASCII it would be72.