nullptr (C++/CLI および C++/CX)
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
を含むすべてのコード生成オプションでサポートされています)