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
слово не является типом и не поддерживается для использования:
Ключевое 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
.