10

std :: coutに戻り値があるかどうか知りたいのですが、これを行うと次のようになります。

cout << cout << "";

いくつかのヘキサコードが印刷されます。この印刷された値の意味は何ですか?

4

3 に答える 3

19

のオペランドcout << coutはユーザー定義型であるため、式は事実上関数呼び出しです。コンパイラーはoperator<<、オペランド(この場合は両方ともタイプ)に一致する最適なものを見つける必要がありますstd::ostream

選択できる演算子のオーバーロードの候補はたくさんありますが、通常のオーバーロード解決プロセスに従って、最終的に選択される演算子について説明します。

std::ostreamへの変換を可能にする変換演算子がありますvoid*。これは、ストリームの状態をブール条件としてテストできるようにするために使用されます(つまり、動作を許可if (cout)します)。

右側のオペランド式は、この変換演算子coutを使用して暗黙的に変換され、次に、とaをとるオーバーロードが呼び出されて、このポインター値が書き込まれます。void const*operator<<ostream&void const*

ostreamtovoid*変換の結果の実際の値は指定されていないことに注意してください。仕様では、ストリームが不良状態の場合はnullポインターが返され、それ以外の場合はnull以外のポインターが返されることが義務付けられています。


ストリーム挿入のoperator<<オーバーロードには戻り値があります。オペランドとして提供されたストリームを返します。これにより、挿入操作(および入力ストリームの場合はを使用した抽出操作>>)の連鎖が可能になります。

于 2012-06-11T20:39:04.383 に答える
15

cout 戻り値はありませんcoutタイプのオブジェクトですostreamoperator <<戻り値があり、への参照を返しますcout

参考のためにhttp://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/を参照してください。

一致する唯一の署名は次のとおりです。

ostream&演算子<<(ostream&(* pf)(ostream&));

そのため、operator<<メンバーへのポインタを返します。

ジェームズの答えの1つ。:)

于 2012-06-11T20:36:04.473 に答える
1

それが「」が印刷されたostreamオブジェクトのアドレスになると思います

于 2012-06-11T20:37:32.263 に答える