MSVS 2005 では、次の C コードで 1 つの警告が生成されます。
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++ コードにも当てはまります。
2つのステートメントの違いは何ですか? 複合演算子が右側の式を左側の型に暗黙的にキャストすると聞いたことがありますが、C または C++ 標準への参照は見つかりませんでした。しかし、sum-and-assignment ステートメントは同じことをすべきではないでしょうか? 私はそれが 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
[...]
さらに、警告レベルが 4 に設定されている MSVS 2008 では警告は表示されません。これは、後で修正された VS 2005 のバグと見なすことができますか、それとも元の警告に何らかの意味がありますか? ドキュメントはここでは役に立ちません。