Есть ли неявное продвижение типов в "float = float - float"? - PullRequest
10 голосов
/ 26 апреля 2019

Мы используем QA-C для соответствия MISRA C ++, но инструмент выдает ошибку для кода, подобного этому:

float a = foo();
float b = bar();
float c = a - b;

Насколько я понимаю, это не имеет неявного продвижения типов, так как все будет происходить в кусках размером float, но инструмент сообщает мне, что вычитание вызывает его. Есть ли ситуации, когда возможна неявная реклама?

1 Ответ

15 голосов
/ 26 апреля 2019

Здесь не подразумевается неявное продвижение.

Когда используются преобразования с участием бинарных операторов, они называются обычными арифметическими преобразованиями .

Из стандарта C ++, [expr]/11:

11 Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и дают Типы результатов аналогичным образом. Цель состоит в том, чтобы получить общий тип, который также является типом результата. Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:
...
( 11.4 ) - В противном случае, если один из операндов равен float, другой должен быть преобразован в float.

Поскольку в вашем примере оба операнда float, такого преобразования или продвижения нет.
Так что это может быть ложным срабатыванием инструмента.

...