nullptr (расширения компонентов C++)
Ключевое слово nullptr представляет значение нулевого указателя.Используйте значение указателя null для указания того, что дескриптор объекта, внутренний указатель или собственный тип указателя не указывает на объект.
Используйте nullptr управляемый или с машинным кодом.Компилятор выдает соответствующие, но разные инструкции для управляемых и собственных значений нулевого указателя.Дополнительные сведения об использовании версии C++ стандартом iso этого ключевого слова см. в разделе nullptr.
Ключевое слово __nullptr ключевое слово Майкрософт- определенной, имеет одну и ту же значение, как nullptr, но применяется только к машинному коду.При использовании nullptr с собственным кодом C/C++, а затем компилируете с помощью параметра компилятора /clr, то компилятор не может определить, указывает ли nullptr собственный или управляемое значение нулевого указателя.Чтобы сделать clear намерия компилятору, используйте nullptr, чтобы указать управляемое значение или __nullptr чтобы указать собственное значение.
Ключевое слово nullptr эквивалентно Nothing в Visual Basic и в C#. null
Использование
Ключевое слово nullptr можно использовать маркер, собственный указатель или аргумента функции можно использовать.
Ключевое слово nullptr не является типом и не поддерживается для использования с:
Ключевое слово nullptr можно использовать при инициализации следующих типов указателя.
Собственный указатель
Дескриптор среды выполнения Windows
Управляемый маркер
Управляемый внутренний указатель
Ключевое слово nullptr можно использовать для проверки, если ссылка указателя или дескриптора имеет значение null, используется прежде чем ссылка.
Вызовы функций среди языков, использующих значения null указателями для проверки ошибок должны интерпретироваться правильно.
Невозможно инициализировать маркер равным нулю; можно использовать только nullptr.Присвоение константы 0 на дескриптор объекта приводит упакованное Int32 и приведение к Object^.
Пример
В следующем примере кода показано, что ключевое слово 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 и ноль может использоваться взаимозаменимо на собственными указателями.
// 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");
}
Output
Пример
В следующем примере кода показано, что 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.
// 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 можно использовать в качестве параметра функции.
// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
Console::WriteLine("test");
}
int main() {
f(nullptr);
}
Output
Пример
В следующем примере кода показано, что, если маркеры объявлены явно, и не инициализированы их значения по умолчанию, инициализированное с 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();
}
Output
Пример
В следующем примере кода показано, что nullptr может быть присвоено собственный указатель при компилировании с /clr.
// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
int * i = 0;
int * j = nullptr;
}
Требования
Параметр компилятора: (Не потребованный; поддерживаемый всеми параметрами создания кода, включая /ZW и /clr)