我有一些代码在不同的编译器上表现不同:
std::string strVal = "11";
std::stringstream stream( strVal );
auto value = false;
if( !( stream >> std::noboolalpha >> value ) )
{
// report error - this path is taken on both compilers
}
// "value" is "false" here on in VS 2017, but "true" on GCC 4.6
预期行为的差异,还是GCC中的错误?
根据cppprefence:
如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit。
但是,value
在GCC 4.6上被修改为true
。
答案 0 :(得分:3)
MSVC错误。 [facet.num.get.virtuals] / 6:
效果:如果
(str.flags()&ios_base::boolalpha) == 0
则输入 像long
一样继续进行,除非存储了一个值 进入val
,该值根据以下内容确定:如果是 要存储的值为0
,然后存储false
。如果值为1
则 存储true
。否则true
将被存储,ios_base::failbit
将被存储 分配给err
。
答案 1 :(得分:2)
Running with VC 19 (aka VS2015),您的示例代码显示value
为false
。
在GCC 8上使用-std=
标志返回4.4.7,它始终显示value
已更改为true。
In C++11,它应该将值设置为true,但是在previous standards中它应该保持不变,这是T.C.笔记是标准本身的缺陷。因此,MSVC在C ++ 11中不符合要求,GCC在早期标准下不符合要求,但现在符合要求。