nullptr (C++/CLI и C++/CX)

Ключевое слово nullptr представляет значение указателя NULL. Значение пустого указателя показывает, что тип дескриптора объекта, внутреннего указателя или собственного указателя не указывает на объект.

Используется nullptr с управляемым или машинным кодом. Компилятор выводит соответствующие, но различные инструкции для управляемых и машинных значений пустых указателей. Дополнительные сведения об использовании версии этого ключевого слова в соответствии со стандартом ISO C++ см. в разделе nullptr.

__nullptr ключевое слово — это ключевое слово, относящуюся к корпорации Майкрософт, которая имеет то же значение, что nullptrи код, но применяется только к машинному коду. Если вы используете nullptr собственный код C/C++, а затем компилируете с параметром компилятора /clr , компилятор не может определить, указывает ли nullptr собственное или управляемое значение указателя NULL. Чтобы сделать намерение понятным компилятору, используйте nullptr для указания управляемого значения или __nullptr для указания собственного значения.

Ключевое слово nullptr эквивалентен Nothing в Visual Basic и null в C#.

Использование

nullptr Ключевое слово можно использовать в любом месте дескриптора, собственного указателя или аргумента функции.

Ключевое слово nullptr не является типом и не поддерживается для использования:

  • sizeof

  • typeid

  • throw nullptr (однако throw (Object^)nullptr; будет работать)

Ключевое слово nullptr можно использовать в инициализации следующих типов указателей:

  • собственного указателя;

  • дескриптора среды выполнения Windows;

  • управляемого дескриптора;

  • управляемого внутреннего указателя.

nullptr Ключевое слово можно использовать для проверки, имеет ли указатель или дескриптор null перед использованием ссылки.

Вызовы функций для языков, использующих значения пустых указателей для проверки ошибок, должны правильно интерпретироваться.

Невозможно инициализировать дескриптор до нуля; можно использовать только 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 взаимозаменяемого использования

В следующем примере кода показано, что nullptr и ноль можно использовать взаимозаменяемо на собственных указателях.

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

В следующем примере кода показано, что nullptr при компиляции с помощью собственного указателя /clrможно назначить указатель.

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

Требования

Параметр компилятора: необязателен; поддерживается всеми параметрами создания кода, включая /ZW и /clr.

См. также

Расширения компонентов для .NET и UWP
nullptr