nullptr問題を解決

0からNULLへ

0リテラルのC ++世界はヌルポインタを示すために使用されて、0がリテラルのすべてのタイプのポインタとして使用することができます。より明確にするために、セマンティック紹介するNULLマクロ定義を:

#undef NULL
#ifdef __cplusplus
    #define NULL 0
#else
    #define NULL ((void *)0)
#endif

C ++でのこのショーは、NULL(0のいくつかの実装で置き換えられているNULLC ++ができないため、これは、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上記の二つの問題に最適なソリューション。

おすすめ

転載: www.cnblogs.com/HachikoT/p/12164309.html