From 533c54260230bc66ece67eda846b3412bdd38ee7 Mon Sep 17 00:00:00 2001 From: Kazutoshi SATODA Date: Sat, 7 Jan 2023 13:33:17 +0900 Subject: [PATCH] =?UTF-8?q?NULL:=20C++03=20=E3=81=AE=E8=A6=8F=E5=AE=9A?= =?UTF-8?q?=E3=81=AB=E3=81=A4=E3=81=84=E3=81=A6=E5=AE=9F=E9=9A=9B=E3=81=AE?= =?UTF-8?q?=E8=A6=8F=E6=A0=BC=E3=81=A8=E5=90=88=E8=87=B4=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84=E8=A8=98=E8=BF=B0=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 下記コメントで挙げていた問題点の修正です。 https://github.com/cpprefjp/site/commit/a4d88a89f656c3f7137b1cc6eaf2997eaa4409e7#r86623360 また、 NULL の値が互換性維持のため整数定数式で維持されることについては どれぐらいの実装が該当するのか不明な感じだったので、確認された実例を含む 記事への参照を追加しました。 --- reference/cstddef/null.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reference/cstddef/null.md b/reference/cstddef/null.md index d84b66ceef..4626fc22b8 100644 --- a/reference/cstddef/null.md +++ b/reference/cstddef/null.md @@ -22,9 +22,12 @@ ## 備考 -C++03において、「ヌルポインタ定数」は「値が0の整数リテラル」と定義されていた。したがって、マクロ`NULL`の値として`0`や`0L`は規格に適合する定義だが、`(void*)0`はリテラルではなく式であるため不正である。 +C++03において、「ヌルポインタ定数」は「値が0になる整数定数式」と定義されていた。したがって、マクロ`NULL`の値として`0`や`0L`は規格に適合するが、`(void*)0`は整数定数式ではないため適合しない。 -C++11では、「ヌルポインタ定数」の定義に「[`std::nullptr_t`](/reference/cstddef/nullptr_t.md)型のprvalue」が追加されたため、`nullptr`も規格に適合する。しかし、`NULL`の値の型が変わるとコードの互換性を損なうことから、当面の間 `NULL` の定義は整数リテラルであると思われる。C++11以降は`NULL`ではなく[`nullptr`](/lang/cpp11/nullptr.md)を使用するとよい。 +C++11では、「ヌルポインタ定数」の定義に「[`std::nullptr_t`](/reference/cstddef/nullptr_t.md)型のprvalue」が追加されたため、`nullptr`も規格に適合する。しかし、`NULL`の値の型が変わるとコードの互換性を損なうことから、当面の間`NULL`の値は整数定数式であると思われる。C++11以降は`NULL`ではなく[`nullptr`](/lang/cpp11/nullptr.md)を使用するとよい。 ## 関連項目 - [C++11 `nullptr`](/lang/cpp11/nullptr.md) + +## 参照 +- [Does any major C++ implementation actually define `NULL` as `nullptr`? - Stack Overflow](https://stackoverflow.com/questions/61699775/does-any-major-c-implementation-actually-define-null-as-nullptr)