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
.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по