tipo que not declared convertir array c++ c++11 implicit-conversion nullptr

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.



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) { }