是弦读读取失败非确定性的

Are stringstream read failures non-deterministic?

本文关键字:非确定 确定性 失败 读取      更新时间:2023-10-16

我的代码在不同的编译器上的行为不同:

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:

如果提取失败(例如,如果在预期数字的位置输入字母(,则值不过了,设置了失败。

但是,value正在修改为GCC 4.6上的true

msvc错误。[facet.num.get.virtuals]/6:

效果:如果(str.flags()&ios_­base​::​boolalpha) == 0然后输入 收益是long的收益,但如果存储一个值 在val中,该值是根据以下内容确定的:如果 要存储的值是0,然后存储false。如果值是 1,则 true存储。否则true存储并且ios_­base​::​failbit是 分配给err

使用VC 19(又称VS2015(运行,您的示例代码显示valuefalse

在GCC 8上回到4.4.7,带有任何-std=标志,总是表明value已更改为true。

在C 11中,它应该将值设置为True,但按照先前的标准,它应该使其保持不变,而T.C.笔记是标准本身的缺陷。因此,MSVC在C 11中是不合格的,而GCC在早期标准下是不合格的,但现在是一致的。