Каковы правила, определяющие приоритет при выводе типа C ++ 11?

Каковы правила, определяющие приоритет в выводе типов C ++ 11 для типов с плавающей запятой / типа double, например, при выводе из выражения, содержащего несколько типов, например:

auto var = float(1) * double(1);

2

Решение

Результатом будет 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) должны выполняться для обоих операндов.

8

Другие решения

Вывод типа не добавляет ничего нового, выражение справа от ‘=’ вычисляется как всегда, а затем его тип используется для ‘auto’.

Это немного интереснее, если взглянуть на различия между ‘auto var’ и ‘auto & вар и тому подобное, но это был не твой вопрос.

2

Ответ зависит от рассматриваемых типов. В вашем конкретном примере стандарт гарантирует, что sizeof(double) >= sizeof(float) поэтому результирующий тип double * float всегда будет double, (это правило, унаследованное от языка C, и, как правило, то же самое во многих других языках, производных от C)

При инициализации переменной с помощью auto ключевое слово, определяется результирующий тип выражения инициализации — будь то из функции return, вычисления, decltype и т. д. Тип зависит от неявных и явных преобразований, доступных для типов, которые вы используете.

2
По вопросам рекламы [email protected]