これがうまくいく理由:
cout << "foo";
これはそうではありませんが?
(&cout)->operator<<("foo");
数値で問題なく動作するので、オーバーライドに関連するものだと思います。(MS Visual C++ コンパイラを使用しています。)
operator<<
限られた数の型のみのメンバー関数として実装されています。他の型の場合、次のようなグローバル オーバーロードとして実装されます。
std::ostream &operator<<(std::ostream &os, T const &t) {
// write the data here
}
使用した構文は、グローバルとしてではなく、メンバー関数として実装されているオーバーロードでのみ機能します。
cout
オーバーロードされたメンバー関数がありますoperator<<(const void *)
。これは引数 に最もよく一致します"foo"
。(const char*
は暗黙的に に変換されconst void*
ます。) したがって、ポインターが出力されます。
// These call std::ostream& operator<<(std::ostream &os, const char * val)
cout << "foo";
operator<<(cout,"foo");
// This calls cout's member function operator<<(const void * val)
(&cout)->operator<<("foo");
出力を として取得するにはcout << "foo";
、演算子をオーバーロードする必要があります<<
。