Considere el siguiente programa C++ que muestra un problema con NULL (necesidad de nullptr)
CPP
// C++ program to demonstrate problem with NULL #include <bits/stdc++.h> using namespace std; // function with integer argument void fun(int N) { cout << "fun(int)"; return;} // Overloaded function with char pointer argument void fun(char* s) { cout << "fun(char *)"; return;} int main() { // Ideally, it should have called fun(char *), // but it causes compiler error. fun(NULL); }
Producción:
16:13: error: call of overloaded 'fun(NULL)' is ambiguous fun(NULL);
¿Cuál es el problema con el programa anterior?
NULL normalmente se define como (void *)0 y se permite la conversión de NULL a tipos integrales. Entonces, la llamada a la función fun(NULL) se vuelve ambigua.
CPP
// This program compiles (may produce warning) #include<stdio.h> int main() { int x = NULL; }
¿Cómo resuelve nullptr el problema?
En el programa anterior, si reemplazamos NULL con nullptr, obtenemos el resultado como «fun(char *)».
nullptr es una palabra clave que se puede usar en todos los lugares donde se espera NULL. Al igual que NULL, nullptr es implícitamente convertible y comparable a cualquier tipo de puntero. A diferencia de NULL, no es implícitamente convertible ni comparable a los tipos integrales .
CPP
// This program does NOT compile #include<stdio.h> int main() { int x = nullptr; }
Producción:
Compiler Error
Como nota al margen, nullptr es convertible a bool.
CPP
// This program compiles #include<iostream> using namespace std; int main() { int *ptr = nullptr; // Below line compiles if (ptr) { cout << "true"; } else { cout << "false"; } }
Producción:
false
Hay algunas cosas no especificadas cuando comparamos dos punteros simples, pero la comparación entre dos valores de tipo nullptr_t se especifica como, la comparación por <= y >= devuelve verdadero y la comparación por < y > devuelve falso y compara cualquier tipo de puntero con nullptr por == y != devuelve verdadero o falso si es nulo o no nulo respectivamente.
C
// C++ program to show comparisons with nullptr #include <bits/stdc++.h> using namespace std; // Driver program to test behavior of nullptr int main() { // creating two variables of nullptr_t type // i.e., with value equal to nullptr nullptr_t np1, np2; // <= and >= comparison always return true if (np1 >= np2) cout << "can compare" << endl; else cout << "can not compare" << endl; // Initialize a pointer with value equal to np1 char *x = np1; // same as x = nullptr (or x = NULL // will also work) if (x == nullptr) cout << "x is null" << endl; else cout << "x is not null" << endl; return 0; }
Producción :
can compare x is null
Este artículo es una contribución de Utkarsh Trivedi. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA