c++ ternary-operator cout

c++ - Tipo de expresión ternaria



ternary-operator cout (2)

¿Alguien puede explicar la salida del siguiente programa:

#include <iostream> using namespace std; int main() { int test = 0; cout << "First character " << ''1'' << endl; cout << "Second character " << (test ? 3 : ''1'') << endl; return 0; }

Salida:
Primer personaje 1
Segundo personaje 49

Pero ambas declaraciones de printf deberían imprimir la misma línea.


El tipo de expresión ''1'' es char .

El tipo de expresión (test ? 3 : ''1'') es al menos int (o una versión sin firmar de la misma; por el contrario, es std::common_type_t<int, char> ).

Por lo tanto, las dos invocaciones del operador << seleccionan diferentes sobrecargas: la primera imprime el carácter tal como está, la última formatea el entero como su representación de cadena decimal. (El valor integral del carácter ''1'' está definido por su conjunto de caracteres base).


cout mostrará el valor de la expresión (test ? 3 : ''1'') después de deducir el <<operator apropiado. En este caso, es int , Puedes verificarlo usando un buen truco que Scott Meyers propagó en su libro más nuevo :

template < typename T > class TD; // Type Displayer int main() { int test = 0; TD<decltype((test ? 3 : ''1''))> xType; return 0; }

esto genera un error, que también le dará información del tipo de expresión:

main.cpp: 6: 34: error: el agregado ''TD < int > xType'' tiene un tipo incompleto y no se puede definir TD xType;

que es int . Y static_cast<int>(''1'') es 49.