6

この質問のサンプル コードを調べたとき、未定義の動作が原因で、その後の の使用を妨げていたと思いましたstd::coutしかし、null ポインターを出力しようとすると、ストリーム状態に設定され、std::ios_base::badbitstd::ios_base::failbit操作不能になる本当の原因であることが判明しました。このため、null ポインターを出力する (試行する) のが本当に未定義の動作であるかどうかに興味があります。だからここに私の質問があります:

  1. nullポインタを出力するのは未定義の動作ですか? もしそうなら、これを引き起こすのはストリームインサーターについて何ですか? インサーターは、ヌルポインターを逆参照しないほど十分にスマートであると確信しています。

  2. また、このコンテキストでヌルポインターに遭遇したときにインサーターがエラーマスクを設定する理由 (具体的には ) も知りたいbadbitです。文字列リテラルの終了のように扱わないのはなぜですか?

私は標準を手元に持っていません。残念ながらリンク切れにつながったソースは 1 つしか見つかりませんでした。

4

2 に答える 2

11

basic_ostreamoperator<<(basic_ostream<>&, const char*)関数では、char*が null でないことが必要です。ポインタが指す文字列を出力するように設計されています。したがって、 nullchar*をに送信するのは未定義の動作coutです。(C++11 27.7.3.6.4/3「文字挿入機能テンプレート」を参照)。

ただし、basic_ostreamoperator<<(basic_ostream<>&, const void*)関数は単にポインターの値を出力するだけなので、null ポインターはそのオーバーロードで適切に機能します。

于 2014-04-25T04:05:01.603 に答える