このプログラムを考えてみましょう:
#include <iostream>
#include <string>
#include <sstream>
#include <cassert>
int main()
{
std::istringstream stream( "-1" );
unsigned short n = 0;
stream >> n;
assert( stream.fail() && n == 0 );
std::cout << "can't convert -1 to unsigned short" << std::endl;
return 0;
}
OS X 10.5.6 の gcc (バージョン 4.0.1 Apple Inc. ビルド 5490) でこれを試しましたが、アサーションは true です。-1 を unsigned short に変換できません。
ただし、Visual Studio 2005 (および 2008) では、アサーションは失敗し、結果の n の値は、コンパイラが生成した暗黙的な変換から期待されるものと同じです。つまり、"-1" は 65535、"-2" は 65534 などです。 . しかし、32767 に変換される "-32769" でおかしくなりました。
ここで誰が正しくて誰が間違っているのですか? (そして、-32769 で何が起こっているのか??)