c++ - que - nullptr was not declared in this scope
¿Por qué no se puede convertir nullptr a int? (4)
Resumen: nullptr
convierte a bool
, y bool
convierte a int
, ¿por qué no se convierte nullptr
a int
?
Este código está bien:
void f(bool);
f(nullptr); // fine, nullptr converts to bool
Y esto está bien:
bool b;
int i(b); // fine, bool converts to int
Entonces, ¿por qué no está bien?
void f(int);
f(nullptr); // why not convert nullptr to bool, then bool to int?
En la sección 4.1 de la Norma, se explica cómo se realizan las conversiones:
Las conversiones estándar son conversiones implícitas con significado incorporado. La cláusula 4 enumera el conjunto completo de tales conversiones. Una secuencia de conversión estándar es una secuencia de conversiones estándar en el siguiente orden:
- Cero o una conversión del siguiente conjunto: conversión de lvalue a rvalue, conversión de matriz a puntero y conversión de función a puntero.
- Cero o una conversión del siguiente conjunto: promociones integrales, promoción de punto flotante, conversiones integrales, conversiones de punto flotante, conversiones integrales flotantes, conversiones de puntero, conversiones de puntero a miembro y conversiones booleanas.
- Cero o una conversión de calificación.
Así que el compilador solo hace "cero o una conversión" de algunos, ninguno o todos los tipos de conversiones anteriores, no muchos arbitrariamente. Y eso es algo realmente bueno .
Keyworkd nullptr se introduce en c ++ 11 debido a la definición múltiple de C NULL , y confunde cuando se sobrecarga una función con argumentos int y NULL.
#define NULL 0
#define NULL (void*)0
En la Biblia El lenguaje de programación C ++ (4º), página 270
La conversión de puntero a bool es útil en condiciones, pero confunde en otra parte.
Entonces, creo que no se permite la conversión de nullptr_t a int porque esta es la razón por la que existe, pero se puede usar como condición de prueba como las variables bool.
Para comprender por qué ocurre esto, debe comprender cómo usar nullptr
. Revisa estos enlaces a continuación:
Espero que ayude.
Porque es exactamente la idea principal de nullptr
.
nullptr
estaba destinado a evitar este comportamiento:
struct myclass {};
void f(myclass* a) { std::cout << "myclass/n"; }
void f(int a) { std::cout << "int/n"; }
// ...
f(NULL); // calls void f(int)
Si nullptr
fuera convertible a int
, se producirá este comportamiento.
Entonces la pregunta es " ¿por qué es convertible a bool
?".
Sintaxis- "suggarness":
int* a = nullptr;
if (a) {
}
Que se ve mucho mejor que:
if (a == nullptr) {
}