2017-04-21 15 views
8

私は、スタンダードが逆参照nullがUBであることを常に知らせてきました。しかし、Dereference nullは必ずしもUBではありませんか?

(Link 1)氏は述べています

のp = 0; * p;本質的にエラーではありません。

(Link 2)へのリンクを提供すること

* pはエラー左辺値が左辺値

に変換されていない限り、pがnullのとき(私は信じていないと言いますそれはタイプミスで、おそらく読むべきです左辺値はの右辺値に変換されます

リンク1も言う

のchar * p = 0で。私が唯一として読むことができるのchar * Q = & *(P)

は "undefinedではない" で、または少なくとも明確に定義された実装定義

は、言語の弁護士は提供できます何が起こっているのかの権威ある説明?

+0

私は言語弁護士ではありませんが、私のリンクを読むことは、それ自身のUBではなく、値を使用するだけでヌルポインタを逆参照することです。そして、はい、それはtypoと思われる、それはリンク1で引用されているように、右値に左値にする必要があります。静的メンバーの場合は静的な型だけが必要であり、link1はそれがわかる限り、それと一貫しているので、意味があると思います。 – drRobertz

+0

実装がそれをsegfaultにする場合、それは本当にUBですか?私はそうでないものは考えられません。 – Donnie

答えて

4

this answerのヌルポインタによる間接的な話題を取り上げました。一言で言えば、それは実際には、それ自体がよく定義されたコアの問題で精巧に定義されたものです。委員会は何年も前に提案されたように(しかし決して採用されなかった)空白の左利きの概念を使用した。 *pはそのような空白の左辺値であると考えられます。左辺値の後ろに存在しない(存在しない)メモリ位置にアクセスしようとしない限り、左辺値と右辺値の変換を実行すると、他のすべての演算は期待どおりに動作します。例えば。 &*ppが無効でない限りpに相当します。 (これは配列の終わりを指すポインタのためにも共通しています。共通のイディオム&arr[n]に必要です)。

私もpaper for empty lvaluesのドラフトを開始しました(これはWIPであり、N4640に対するリベースはまだ完了していません)ので、後で詳しく説明します。

関連する問題