EzoeRyou/cpp-intro

意味上のポインター: #3 "不適切と思われる説明2点" のつづき

Opened this issue · 0 comments

( close となった issue の reopen はできなかったので、つづきを別 issue としています。)
#3 (comment) より:

...昔のC言語では0はnullポインターの値だと規格上定められてはいなかった。

「規格」としておそらく最古の C89 時点でも 0 はヌルポインタ定数とされています。
http://port70.net/~nsz/c/c89/c89-draft.html#3.2.2.3

An integral constant expression with the value 0, or such an
expression cast to type void * , is called a null pointer constant. ...

同様の規定が C99, C11 のドラフトでも確認できます。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

ということで以下の点を改めて見直しおねがいします。

  • c250d15#diff-d27600081f0d6802e8fd7ede213346bfR230

    C++ではさらに歴史的な理由で、0もnullポインター値として扱う。

    ポインタの文脈で 0 をnullポインター値として扱う(ヌルポインタ定数と
    する)のはC言語も同じなので、「C++では」として直前の NULL の紹介と
    分けられているのは不適切だと思います。

修正 50afb5a 後の文面について。

...わからない値を持ったポインターの参照先への読み書きは未定義の挙動を引き起こす。

実際は参照先への読み書き以前に(直前の int の例と同様に)未初期化変数の
値を読んだ時点で未定義動作となります。参照先の読み書きを行わない
std::cout << pointer でも未定義動作ということです。
後続の「なぜ未定義の挙動になるかというと~」も含めて、この記述だと
「読み書きさえしなければ未定義動作とならない」と読まれる可能性があり、
適切ではないと思います。