nullptr (C++/CLI e C++/CX)
A palavra-chave nullptr
representa um valor de ponteiro nulo. Use um valor de ponteiro nulo para indicar que um tipo de identificador de objeto, ponteiro interno ou ponteiro nativo não aponta para um objeto.
Use nullptr
com código gerenciado ou nativo. O compilador emite instruções apropriadas, mas diferentes, para valores de ponteiro nulo gerenciados e nativos. Confira mais informações sobre como usar a versão C++ do padrão ISO dessa palavra-chave em nullptr.
A palavra-chave __nullptr é específica da Microsoft e tem o mesmo significado que nullptr
mas aplica-se somente a um código nativo. Se você usar nullptr
com código C/C++ nativo e, em seguida, compilar com a opção do compilador /clr, o compilador não conseguirá determinar se nullptr
indica um valor de ponteiro nulo nativo ou gerenciado. Para deixar sua intenção clara para o compilador, use nullptr
para especificar um valor gerenciado ou __nullptr para especificar um valor nativo.
A palavra-chave nullptr
é equivalente a Nothing no Visual Basic e null em C#.
Uso
A palavra-chave nullptr
pode ser usada em qualquer lugar em que um identificador, um ponteiro ou uma função possa ser usado.
A palavra-chave nullptr
não é um tipo e não é compatível com:
A palavra-chave nullptr
pode ser usada na inicialização dos seguintes tipos de ponteiro:
Ponteiro nativo
Identificador do Windows Runtime
Identificador gerenciado
Ponteiro interno gerenciado
A palavra-chave nullptr
pode ser usada para testar se uma referência de ponteiro ou identificador é nula antes de essa referência ser usada.
Chamadas de função entre linguagens que usam valores de ponteiro nulo para verificação de erros devem ser interpretadas corretamente.
Você não pode inicializar um identificador para zero. Somente nullptr
pode ser usado. A atribuição da constante 0 a um identificador de objeto produz um Int32
com conversão boxing e uma conversão em Object^
.
Exemplo: palavra-chave nullptr
O exemplo de código a seguir demonstra que a palavra-chave nullptr
pode ser usada sempre que um identificador, um ponteiro nativo ou um argumento de função pode ser usado. Além disso, ele demonstra que a palavra-chave nullptr
pode ser usada para verificar uma referência antes que esta seja usada.
// 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 ^)
}
Exemplo: usar nullptr
e zero de modo intercambiável
O exemplo de código a seguir mostra que nullptr
e zero podem ser usados alternadamente em ponteiros nativos.
// 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
Exemplo: interpretar nullptr
como um identificador
O exemplo de código a seguir mostra que nullptr
é interpretada como um identificador para qualquer tipo ou um ponteiro nativo para qualquer tipo. Em caso de sobrecarga de função com identificadores para tipos diferentes, um erro de ambiguidade será gerado. A palavra-chave nullptr
teria que ser explicitamente convertida em um tipo.
// 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);
}
Exemplo: converter nullptr
O exemplo de código a seguir mostra que a conversão de nullptr
é permitida e retorna um ponteiro ou identificador para o tipo de conversão que contém o valor 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)
}
Exemplo: passar nullptr
como um parâmetro de função
O exemplo de código a seguir mostra que nullptr
pode ser usado como um parâmetro de função.
// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
Console::WriteLine("test");
}
int main() {
f(nullptr);
}
test
Exemplo: inicialização padrão
O exemplo de código a seguir mostra que, quando identificadores são declarados e não são inicializados explicitamente, eles são inicializados por padrão como 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
Exemplo: atribuir nullptr
a um ponteiro nativo
O exemplo de código a seguir mostra que nullptr
pode ser atribuído a um ponteiro nativo quando você compila com /clr
.
// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
int * i = 0;
int * j = nullptr;
}
Requisitos
Opção do compilador: (Não é necessário; é compatível com todas as opções de geração de código, incluindo /ZW
e /clr
)