Каковы правила, определяющие приоритет в выводе типов C ++ 11 для типов с плавающей запятой / типа double, например, при выводе из выражения, содержащего несколько типов, например:
auto var = float(1) * double(1);
Результатом будет double
, Это называется floating point promotion
,
Из стандарта, ISO 14882: 2011, 4.6 Акция с плавающей точкой:
1 Значение типа float может быть преобразовано в значение типа double. Значение не изменяется.
2 Это преобразование называется продвижением с плавающей запятой.
Как отмечает @sftrabbit, в 5. Выражения, пункт 9 в новом стандарте:
Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и выдают типы результатов аналогичным образом. Цель состоит в том, чтобы получить общий тип, который также является типом результата.
Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:
— Если какой-либо из операндов имеет тип перечисления с ограничением (7.2), преобразования не выполняются; если другой операнд не имеет того же типа, выражение неправильно сформировано.
— Если один из операндов имеет тип long double, другой должен быть преобразован в long double.
— В противном случае, если один из операндов является двойным, другой должен быть преобразован в двойной.
— В противном случае, если один из операндов является float, другой должен быть преобразован в float.
— В противном случае интегральные преобразования (4.5) должны выполняться для обоих операндов.
Вывод типа не добавляет ничего нового, выражение справа от ‘=’ вычисляется как всегда, а затем его тип используется для ‘auto’.
Это немного интереснее, если взглянуть на различия между ‘auto var’ и ‘auto & вар и тому подобное, но это был не твой вопрос.
Ответ зависит от рассматриваемых типов. В вашем конкретном примере стандарт гарантирует, что sizeof(double) >= sizeof(float)
поэтому результирующий тип double * float
всегда будет double
, (это правило, унаследованное от языка C, и, как правило, то же самое во многих других языках, производных от C)
При инициализации переменной с помощью auto
ключевое слово, определяется результирующий тип выражения инициализации — будь то из функции return, вычисления, decltype и т. д. Тип зависит от неявных и явных преобразований, доступных для типов, которые вы используете.