13

もちろん、次のコードは機能します (std::cout::operator<< を呼び出します):

cout << 1 << '1' << "1" << endl;

たまたま std::operator<< もあり、char または char* 引数に対してのみ機能するようです。

operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

では、なぜこの演算子が必要で、どのように使用するのでしょうか?

ありがとう。

4

2 に答える 2

7
operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

最初の 2 つは、 2 つの引数を取る非メンバー関数を呼び出すため機能します。引数としてcharandを取る関数は、非メンバー(フリー) 関数として定義されます。char const*

ただし、引数として取る関数はメンバーint関数として定義されているため、3 番目の関数はメンバー関数を呼び出す必要があります。非メンバー関数として呼び出す場合は、非メンバー関数が存在するに変換する必要があります。したがって、この変換を考慮すると、同じように適切な変換が多数存在するため、あいまいさが生じます。int

前述のように、これは機能するはずです:

cout.operator<<(1); //should work

一部の関数がメンバーとして定義され、他の関数が非メンバーとして定義されている理由については、答えがわかりません。ライブラリのこの設計につながった提案と決定について、多くの研究が必要です。

于 2013-10-19T04:20:54.190 に答える