В разделе 10.5.1 новой статьи Stroustrup "Язык программирования С++ - четвертое издание" он говорит, что перед выполнением арифметической операции интегральное продвижение используется для создания ints из более коротких целочисленных типов, и аналогичным образом, точечное продвижение используется для создания двойников из поплавков.
Я подтвердил первое требование со следующим кодом:
#include <iostream>
#include <typeinfo>
int main()
{
short a;
short b;
std::cout << typeid(a + b).name() << std::endl;
}
Это выводит "int" с vС++ и "i" с gcc.
Но тестируя его с помощью float вместо коротких замыканий, выход по-прежнему остается "float" или "f":
#include <iostream>
#include <typeinfo>
int main()
{
float a;
float b;
std::cout << typeid(a + b).name() << std::endl;
}
В соответствии с Stroustrup нет исключений из правила продвижения с плавающей запятой, поэтому я ожидал вывод "double" или "d".
Является ли упомянутый раздел о рекламных акциях неправильным или каким-то образом неясным? И есть ли разница в С++ 98 и С++ 11 относительно продвижения по типу?