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.