Тип тройного выражения
Может кто-нибудь объяснить вывод следующей программы:
#include <iostream>
using namespace std;
int main()
{
int test = 0;
cout << "First character " << '1' << endl;
cout << "Second character " << (test ? 3 : '1') << endl;
return 0;
}
Вывод:
Первый символ 1
Второй символ 49
Но оба оператора printf
должны печатать одну и ту же строку.
Ответы
Ответ 1
Тип выражения '1'
равен char
.
Тип выражения (test ? 3 : '1')
не менее int
(или его неподписанная версия, возможно, это std::common_type_t<int, char>
).
Поэтому две вызовы оператора <<
выбирают разные перегрузки: первая печатает символ как есть, последний форматирует целое число как его десятичное строковое представление. (Интегральное значение символа '1'
определяется вашим базовым набором символов.)
Ответ 2
cout
отобразит значение выражения (test ? 3 : '1')
после выведения соответствующего <<operator
. В этом случае это int
, вы можете проверить его, используя хороший трюк, который Скотт Мейерс распространил в своей самой новой книге:
template < typename T > class TD; // Type Displayer
int main()
{
int test = 0;
TD<decltype((test ? 3 : '1'))> xType;
return 0;
}
это генерирует ошибку, которая также даст вам информацию о типе вашего выражения:
main.cpp: 6: 34: error: aggregate 'TD < int > xType' имеет неполный тип и не может быть определено TD xType;
который равен int
. И static_cast<int>('1')
равно 49.