コード:
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using std::cerr;
using std::cout;
using std::stringstream;
using std::string;
using std::for_each;
void convert(const string& a_value)
{
unsigned short i;
if (stringstream(a_value) >> i)
cout << a_value << " converted to " << i << ".\n";
else
cerr << a_value << " failed to convert.\n";
}
int main()
{
string inputs[] = { "abc", "10", "999999999999999999999", "-10", "0" };
for_each(inputs, inputs + (sizeof(inputs)/sizeof(inputs[0])), convert);
return 0;
}
Visual Studioコンパイラ(v7、v8、v9、v10)からの出力:
abcは変換に失敗しました。 10を10に変換します。 999999999999999999999は変換に失敗しました。 -10は65526に変換されます。 0は0に変換されます。
g ++(v4.1.2、v4.3.4)からの出力:
abcは変換に失敗しました。 10を10に変換します。 999999999999999999999は変換に失敗しました。 -10は変換に失敗しました。 0は0に変換されます。
"-10"
に変換できないと思っていましたがunsigned short
、VCコンパイラでは成功します。これは:
- VCコンパイラのバグ?
- GNUコンパイラのバグと私は間違った期待を持っていますか?
- 実装で定義された動作?