C4244 предупреждение уровня 4 о назначении сложного соединения, но не о сумме и назначении

В MSVS 2005 следующий код C генерирует одно предупреждение:

int main() {
short a = 0;
a += a; // C4244 (level 4)
a = a + a; // OK
}

Предупреждающее сообщение:

warning C4244: '+=' : conversion from 'int' to 'short', possible loss of data

То же самое касается кода C ++.

В чем разница между двумя утверждениями? Я слышал, но не мог найти никакой ссылки на какой-либо стандарт C или C ++, что составной оператор неявно приводит правое выражение к типу левой части. Но должен ли оператор суммы и назначения делать то же самое? Я также подозревал, что это связано с продвижением int, но, как я вижу из разборки, это происходит в обоих случаях:

[...]
a += a; // C4244 (level 4)
00411394  movsx       eax,word ptr [a]
00411398  movsx       ecx,word ptr [a]
0041139C  add         ecx,eax
0041139E  mov         word ptr [a],cx
a = a + a; // OK
004113A2  movsx       eax,word ptr [a]
004113A6  movsx       ecx,word ptr [a]
004113AA  add         eax,ecx
004113AC  mov         word ptr [a],ax
[...]

Кроме того, предупреждение не появляется в MSVS 2008 с уровнем предупреждения, установленным на 4. Так могу ли я считать это ошибкой в ​​VS 2005, которая была исправлена ​​позже, или есть какой-то смысл в первоначальном предупреждении? Документация мне здесь не помогает.

2

Решение

Это похоже на поддельное предупреждение.

Предупреждения должны предупреждать вас о написанном вами коде, а не о промежуточных операциях.

Код, который вы написали, не работает ни с одним int — только промежуточные операции.

Запрос о случай почти идентичный вашему на форумах Visual Studio Languages ​​отвечает Джонатан Кейвс — MSFT. Его ответ заканчивается:

«Это было в нашем списке ошибок, чтобы исправить в течение долгого времени —
к сожалению, мы всегда находим больше «важных» ошибок, чтобы исправить
найти способ исправить это — но когда-нибудь мы будем. «

3

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

Других решений пока нет …