0からNULLへ
0リテラルのC ++世界はヌルポインタを示すために使用されて、0がリテラルのすべてのタイプのポインタとして使用することができます。より明確にするために、セマンティック紹介するNULL
マクロ定義を:
#undef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
C ++でのこのショーは、NULL
(0のいくつかの実装で置き換えられているNULL
C ++ができないため、これは、0Lとして定義することができる)void
ポインタは暗黙のポインタの他の型に変換されるが、各ポインタ型リテラルとして0を可能にします定数。
。そうする間に使用されるが、いくつかのマイナーな欠点がありますすることができます:1、それぞれの使用はNULL
、マクロ定義の導入というの一般的な紹介確保する必要性の前に<cstddef>
ヘッダファイルを、2つのいくつかのシーンはトラブルになります。:
void func(char *str) {
printf("char *");
}
void func(int n) {
printf("int");
}
int main() {
func(NULL);
return 0;
}
ここで私は、呼び出したいと思ったfunc(char *)
機能のバージョンを、実際にそれが呼ばれているfunc(int)
バージョン。特に、いくつかの達成NULL
コンパイラがあいまいなエラーを報告します0L、と定義。
NULLからnullptrへ
この目的のために、C ++ 11が導入新しいキーワードnullptr
に特別に新しい名前が互換性を使用することで前から、NULL
コードを。nullptr
これは、入力された、との型定義さnullptr
そのもの。
typedef decltype(nullptr) nullptr_t;
nullptr
上記の二つの問題に最適なソリューション。