nullptr (C++/CLI および C++/CX)nullptr (C++/CLI and C++/CX)

nullptr キーワードは、"Null ポインター値" を表します。The nullptr keyword represents a null pointer value. Null ポインター値は、オブジェクト ハンドル、内部ポインター、またはネイティブ ポインターの型がオブジェクトを指していないことを示すために使用します。Use a null pointer value to indicate that an object handle, interior pointer, or native pointer type does not point to an object.

nullptr はマネージド コードまたはネイティブ コードのいずれかに使用します。Use nullptr with either managed or native code. コンパイラからは、マネージドおよびネイティブの Null ポインター値に適した異なる命令が発行されます。The compiler emits appropriate but different instructions for managed and native null pointer values. このキーワードの ISO 標準の C++ バージョンの使用については、「nullptr」を参照してください。For information about using the ISO standard C++ version of this keyword, see nullptr.

__nullptr キーワードは Microsoft 固有であり、nullptr と同じ意味ですが、ネイティブ コードにのみ適用されます。The __nullptr keyword is a Microsoft-specific keyword that has the same meaning as nullptr, but applies to only native code. ネイティブの C/C++ コードで nullptr を使用してから /clr コンパイラ オプションを指定してコンパイルすると、コンパイラでは、nullptr が示す Null ポインター値がネイティブかマネージドかを判断できません。If you use nullptr with native C/C++ code and then compile with the /clr compiler option, the compiler cannot determine whether nullptr indicates a native or managed null pointer value. コンパイラに意図を明確に伝えるには、マネージド値を指定する場合は nullptr、ネイティブ値を指定する場合は __nullptr を使用します。To make your intention clear to the compiler, use nullptr to specify a managed value or __nullptr to specify a native value.

nullptr キーワードは、Visual Basic では Nothing、C# では null と同じです。The nullptr keyword is equivalent to Nothing in Visual Basic and null in C#.

使用法Usage

nullptr キーワードは、ハンドル、ネイティブ ポインター、または関数の引数を使用できる場所であれば、どこでも使用できます。The nullptr keyword can be used anywhere a handle, native pointer, or function argument can be used.

nullptr キーワードは型ではないので、以下には使用できません。The nullptr keyword is not a type and is not supported for use with:

  • sizeofsizeof

  • typeidtypeid

  • throw nullptr (ただし throw (Object^)nullptr; は機能します)throw nullptr (although throw (Object^)nullptr; will work)

nullptr キーワードは、以下のポインター型の初期化に使用できます。The nullptr keyword can be used in the initialization of the following pointer types:

  • ネイティブ ポインターNative pointer

  • Windows ランタイム ハンドルWindows Runtime handle

  • マネージド ハンドルManaged handle

  • マネージド内部ポインターManaged interior pointer

nullptr キーワードを使用すると、参照が使用される前にポインターまたはハンドルの参照が null かどうかをテストできます。The nullptr keyword can be used to test if a pointer or handle reference is null before the reference is used.

エラー チェックに Null ポインター値を使用する言語間の関数呼び出しは、正しく解釈されます。Function calls among languages that use null pointer values for error checking should be interpreted correctly.

ハンドルを 0 に初期化することはできません。nullptr のみを使用できます。You cannot initialize a handle to zero; only nullptr can be used. オブジェクト ハンドルに定数 0 を割り当てると、ボックス化された Int32Object^ へのキャストが生成されます。Assignment of constant 0 to an object handle produces a boxed Int32 and a cast to Object^.

Example

次のコード例に、ハンドル、ネイティブ ポインター、または関数の引数を使用できる場所であれば、nullptr キーワードをどこでも使用できることを示します。The following code example demonstrates that the nullptr keyword can be used wherever a handle, native pointer, or function argument can be used. また、この例では、参照の使用前にチェックするために nullptr キーワードを使用しています。And the example demonstrates that the nullptr keyword can be used to check a reference before it is used.

// 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 ^)
}

Example

次のコード例に、ネイティブ ポインターに nullptr と 0 を同様に使用できることを示します。The following code example shows that nullptr and zero can be used interchangeably on native pointers.

// 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

Example

次のコード例に、nullptr が任意の型へのハンドル、または任意の型へのネイティブ ポインターと解釈されることを示します。The following code example shows that nullptr is interpreted as a handle to any type or a native pointer to any type. 異なる型へのハンドルを使用した関数のオーバーロードの場合、あいまいさのエラーが発生します。In case of function overloading with handles to different types, an ambiguity error will be generated. nullptr では明示的に型にキャストする必要があります。The nullptr would have to be explicitly cast to a type.

// 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);
}

Example

次のコード例に、nullptr のキャストが許可され、nullptr 値を含むキャスト型へのポインターまたはハンドルが返されることを示します。The following code example shows that casting nullptr is allowed and returns a pointer or handle to the cast type that contains the nullptr value.

// 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)
}

Example

次のコード例に、nullptr を関数パラメーターとして使用できることを示します。The following code example shows that nullptr can be used as a function parameter.

// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
   Console::WriteLine("test");
}

int main() {
   f(nullptr);
}
test

Example

次のコード例に、ハンドルが宣言され、明示的に初期化されていない場合、既定で nullptr に初期化されることを示します。The following code example shows that when handles are declared and not explicitly initialized, they are default initialized to 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

Example

次のコード例に、/clr を使用してコンパイルするときに、nullptr をネイティブ ポインターに割り当てられることを示します。The following code example shows that nullptr can be assigned to a native pointer when you compile with /clr.

// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
   int * i = 0;
   int * j = nullptr;
}

要件Requirements

コンパイラ オプション:(必須ではありません。/ZW/clr を含むすべてのコード生成オプションでサポートされています)Compiler option: (Not required; supported by all code generation options, including /ZW and /clr)

関連項目See also

.NET および UWP でのコンポーネント拡張Component Extensions for .NET and UWP
nullptrnullptr