現在、多くの新機能を備えた C++11 がリリースされています。興味深くも混乱を招く機能 (少なくとも私にとっては) は、新しい ですnullptr
。
まあ、厄介なマクロはもう必要ありませんNULL
。
int* x = nullptr;
myclass* obj = nullptr;
それでも、どのように機能するのかわかりませんnullptr
。例えば、ウィキペディアの記事言う:
C++11では、区別されたヌル ポインター定数として機能する新しいキーワードnullptr を導入することでこれを修正しています。これはnullptr_t 型であり、暗黙的に変換可能であり、任意のポインター型またはメンバーへのポインター型と比較できます。bool を除き、整数型とは暗黙的に変換または比較できません。
キーワードと型のインスタンスはどのようになっているのでしょうか?
nullptr
また、古き良き よりも が優れている別の例 (Wikipedia のもの以外) はありますか0
?
ベストアンサー1
キーワードと型のインスタンスはどのようになっているのでしょうか?
これは驚くことではありません。true
と は両方ともfalse
キーワードであり、リテラルとしては型 ( bool
) を持ちます。は型 のポインターリテラルnullptr
であり、prvalue です ( を使用してそのアドレスを取得することはできません)。std::nullptr_t
&
4.10
ポインタ変換について、 型の prvalue はstd::nullptr_t
ヌル ポインタ定数であり、整数のヌル ポインタ定数は に変換できるとされていますstd::nullptr_t
。逆方向は許可されていません。これにより、ポインタと整数の両方に対して関数をオーバーロードし、 を渡してnullptr
ポインタ バージョンを選択できます。NULL
またはを渡すと、0
のバージョンが紛らわしく選択されますint
。nullptr_t
を整数型にキャストするには が必要であり、を整数型にreinterpret_cast
キャストする場合と同じセマンティクスを持ちます(マッピング実装は定義済み)。 はどのポインタ型にも変換できません。可能であれば暗黙的な変換に依存するか、 を使用してください。(void*)0
reinterpret_cast
nullptr_t
static_cast
規格では、 で
sizeof(nullptr_t)
あることが要求されていますsizeof(void*)
。