nullptrとNULLの違い
9091 ワード
nullptrが導入された理由nullptrが導入された理由をNULLから説明します.CとC++プログラマーにとって、NULLに慣れていないに違いない.しかしCとC++のNULLは等価ではない.NULLはポインタがオブジェクトを指さないことを示すが、問題はNULLがキーワードではなくマクロ定義(macro)であることである.NULLはCで定義され、NULLはvoid*ポインタ値0として定義されます.
しかし同時に、NULLをC++における整数0 1.2 NULLの定義として定義することも可能であり、NULLは整数0として明確に定義される.
1.3 C++がNULL上で不完全な互換性Cを選択した理由根本的な原因はC++のリロード関数と関係がある.C++はマッチングパラメータのメカニズムを探索することによって最適マッチング(best-match)の関数を見つけようとするが,void*の暗黙型変換をサポートし続けると意味二義性(syntax ambiguous)の問題をもたらす.
//次の2つのリロード関数void foo(int i)を考慮する.void foo(char* p)
foo(NULL);//which is called? 2.nullptrのアプリケーションシーン2.1コンパイラnullptrがサポートされている場合は、nullptrをNULLのマクロ定義の代わりに直接使用する必要があります.正常に使用する過程で彼らは完全に等価です.コンパイラの場合、Visual Studio 2010はnullptrを含むC++0 xのほとんどの特性をサポートし始めました.VS 2010以前のバージョンでは、このキーワードはサポートされていません.Codeblocks10.5付属のG++4.4.1 nullptrはサポートされていません.4.6.1にアップグレードするとnullptrをサポートできます(-std=c++0 xコンパイルオプションが必要です)2.2使用方法0(NULL)とnullptrを交換して使用できます.次の例を示します.シミュレーションnullptrの実装一部のコンパイラはc++11の新しいキーワードnullptrをサポートしていません.nullptrを実装するシミュレーションもできます.
#define NULL (void*)0
しかし同時に、NULLをC++における整数0 1.2 NULLの定義として定義することも可能であり、NULLは整数0として明確に定義される.
// lmcons.h NULL
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
1.3 C++がNULL上で不完全な互換性Cを選択した理由根本的な原因はC++のリロード関数と関係がある.C++はマッチングパラメータのメカニズムを探索することによって最適マッチング(best-match)の関数を見つけようとするが,void*の暗黙型変換をサポートし続けると意味二義性(syntax ambiguous)の問題をもたらす.
//次の2つのリロード関数void foo(int i)を考慮する.void foo(char* p)
foo(NULL);//which is called? 2.nullptrのアプリケーションシーン2.1コンパイラnullptrがサポートされている場合は、nullptrをNULLのマクロ定義の代わりに直接使用する必要があります.正常に使用する過程で彼らは完全に等価です.コンパイラの場合、Visual Studio 2010はnullptrを含むC++0 xのほとんどの特性をサポートし始めました.VS 2010以前のバージョンでは、このキーワードはサポートされていません.Codeblocks10.5付属のG++4.4.1 nullptrはサポートされていません.4.6.1にアップグレードするとnullptrをサポートできます(-std=c++0 xコンパイルオプションが必要です)2.2使用方法0(NULL)とnullptrを交換して使用できます.次の例を示します.
int* p1 = 0;
int* p2 = nullptr;
if(p1 == 0) {}
if(p2 == 0) {}
if(p1 == nullptr) {}
if(p2 == nullptr) {}
if(p1 == p2) {}
if(p2) {}
nullptr , :
[cpp] view plain copy
int n1 = 0; // ok
int n2 = nullptr; // error
if(n1 == nullptr) {} // error
if(n2 == nullptr) {} // error
if(nullprt) {} // error
nullptr = 0 // error
, nullptr , char*。
[cpp] view plain copy
void foo(int) {cout << "int" << endl;}
void foo(char*) {cout << "pointer" << endl;}
foo(0); // calls foo(int)
foo(nullptr); // calls foo(char*)
const
class nullptr_t_t
{
public:
template<class T> operator T*() const {return 0;}
template<class C, class T> operator T C::*() const { return 0; }
private:
void operator& () const;
} nullptr_t = {};
#undef NULL
#define NULL nullptr_t