nullptr キーワードは、"Null ポインター値" を表します。 Null ポインター値は、オブジェクト ハンドル、内部ポインター、またはネイティブ ポインターの型がオブジェクトを指していないことを示すために使用します。
nullptr は、マネージド コードまたはネイティブ コードのいずれかで使用します。 コンパイラからは、マネージドおよびネイティブの Null ポインター値に適した異なる命令が発行されます。 このキーワードの ISO 標準の C++ バージョンの使用については、「nullptr」を参照してください。
__nullptr キーワードは Microsoft 固有であり、nullptr と同じ意味ですが、ネイティブ コードにのみ適用されます。 ネイティブの C/C++ コードで nullptr を使用してから、/clr コンパイラ オプションを指定してコンパイルすると、コンパイラでは、nullptr が示す Null ポインター値がネイティブかマネージドかを判断できません。 コンパイラに意図を明確に伝えるには、マネージド値を指定する場合は nullptr、ネイティブ値を指定する場合は __nullptr を使用します。
nullptr キーワードは、Visual Basic では Nothing、C# では null と同じです。
使用方法
nullptr キーワードは、ハンドル、ネイティブ ポインター、または関数の引数を使用できる場所であれば、どこでも使用できます。
nullptr キーワードは型ではないので、以下には使用できません。
nullptr キーワードは、次のポインター型の初期化に使用できます。
ネイティブ ポインター
Windows ランタイム ハンドル
マネージド ハンドル
マネージド内部ポインター
nullptr キーワードを使用すると、参照が使用される前にポインターまたはハンドルの参照が null かどうかをテストできます。
エラー チェックに Null ポインター値を使用する言語間の関数呼び出しは、正しく解釈されます。
ハンドルを 0 に初期化することはできません。nullptr のみを使用できます。 オブジェクト ハンドルに定数 0 を割り当てると、ボックス化された Int32 と Object^ へのキャストが生成されます。
例: nullptr キーワード
次のコード例は、ハンドル、ネイティブ ポインター、または関数の引数を使用できる場所であれば、nullptr キーワードをどこでも使用できることを示しています。 また、この例は、参照を使用する前のチェックに nullptr キーワードを使用できることを示しています。
// mcpp_nullptr.cpp
// compile with: /clr
value class V {};
ref class G {};
void f(System::Object ^) {}
int main() {
// Native pointer.
int *pN = nullptr;
// Managed handle.
G ^pG = nullptr;
V ^pV1 = nullptr;
// Managed interior pointer.
interior_ptr<V> pV2 = nullptr;
// Reference checking before using a pointer.
if (pN == nullptr) {}
if (pG == nullptr) {}
if (pV1 == nullptr) {}
if (pV2 == nullptr) {}
// nullptr can be used as a function argument.
f(nullptr); // calls f(System::Object ^)
}
例: nullptr と 0 を相互に置き換えて使用する
次のコード例は、ネイティブ ポインター上で nullptr と 0 を相互に置き換えて使用できることを示しています。
// mcpp_nullptr_1.cpp
// compile with: /clr
class MyClass {
public:
int i;
};
int main() {
MyClass * pMyClass = nullptr;
if ( pMyClass == nullptr)
System::Console::WriteLine("pMyClass == nullptr");
if ( pMyClass == 0)
System::Console::WriteLine("pMyClass == 0");
pMyClass = 0;
if ( pMyClass == nullptr)
System::Console::WriteLine("pMyClass == nullptr");
if ( pMyClass == 0)
System::Console::WriteLine("pMyClass == 0");
}
pMyClass == nullptr
pMyClass == 0
pMyClass == nullptr
pMyClass == 0
例: nullptr をハンドルとして解釈する
次のコード例は、nullptr が、任意の型へのハンドル、または任意の型へのネイティブ ポインターとして解釈されることを示しています。 異なる型へのハンドルを使用した関数のオーバーロードの場合、あいまいさのエラーが発生します。 nullptr は、明示的に型にキャストする必要があります。
// mcpp_nullptr_2.cpp
// compile with: /clr /LD
void f(int *){}
void f(int ^){}
void f_null() {
f(nullptr); // C2668
// try one of the following lines instead
f((int *) nullptr);
f((int ^) nullptr);
}
例: nullptr をキャストする
次のコード例は、nullptr のキャストが許可され、nullptr 値を含むキャスト型へのポインターまたはハンドルが返されることを示しています。
// mcpp_nullptr_3.cpp
// compile with: /clr /LD
using namespace System;
template <typename T>
void f(T) {} // C2036 cannot deduce template type because nullptr can be any type
int main() {
f((Object ^) nullptr); // T = Object^, call f(Object ^)
// Delete the following line to resolve.
f(nullptr);
f(0); // T = int, call f(int)
}
例: nullptr を関数パラメーターとして渡す
次のコード例は、nullptr を関数パラメーターとして使用できることを示しています。
// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
Console::WriteLine("test");
}
int main() {
f(nullptr);
}
test
例: 既定の初期化
次のコード例は、ハンドルが宣言され、明示的に初期化されていない場合に、そのハンドルが既定で nullptr に初期化されることを示しています。
// mcpp_nullptr_5.cpp
// compile with: /clr
using namespace System;
ref class MyClass {
public:
void Test() {
MyClass ^pMyClass; // gc type
if (pMyClass == nullptr)
Console::WriteLine("NULL");
}
};
int main() {
MyClass ^ x = gcnew MyClass();
x -> Test();
}
NULL
例: nullptr をネイティブポインターに割り当てる
次のコード例は、/clr を使用してコンパイルするときに、nullptr をネイティブ ポインターに割り当てることができることを示しています。
// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
int * i = 0;
int * j = nullptr;
}
要件
コンパイラ オプション: (必須ではありません。/ZW と /clr を含むすべてのコード生成オプションでサポートされています)