stringstream读取失败是非确定性的吗?

时间:2018-04-24 19:02:32

标签: c++ c++11

我有一些代码在不同的编译器上表现不同:

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

2 个答案:

答案 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),您的示例代码显示valuefalse

GCC 8上使用-std=标志返回4.4.7,它始终显示value已更改为true。

In C++11,它应该将值设置为true,但是在previous standards中它应该保持不变,这是T.C.笔记是标准本身的缺陷。因此,MSVC在C ++ 11中不符合要求,GCC在早期标准下不符合要求,但现在符合要求。