stringstream读取失败是否具有不确定性?跨编译器行为差异问询
关于stringstream读取失败后bool变量值的差异问题
这个行为差异其实是不同C++标准版本规定不同导致的,并不是GCC的bug哦。
先拆解下你的代码逻辑:你尝试用std::noboolalpha模式,把字符串"11"读取到初始值为false的bool变量value里,结果两个编译器都进入了错误分支(说明读取操作失败了),但value的最终值却不一样——VS 2017里还是false,GCC 4.6里变成了true。
这里的关键在于C++标准对输入失败后目标变量状态的规定变化:
- 在C11之前的版本(比如C03),当输入操作失败时,内置类型的目标变量值是未定义行为——标准没有要求编译器必须保持变量的初始值,也没规定要改成什么,编译器怎么处理都算合规。GCC 4.6是比较老的版本,默认遵循C++03,所以
value的值出现异常变化(变成true)是未定义行为的正常表现。 - 从C11开始,标准做了明确调整:如果读取bool类型失败,目标变量会被强制设置为
false。VS 2017默认支持C11及以后的标准,所以它的行为是符合新标准要求的。
简单来说,这不是某一方的bug,只是两个编译器遵循的标准版本不同,导致了行为差异。如果要让GCC也和VS表现一致,可以给GCC开启C++11及以上的编译选项(比如-std=c++11)。
内容的提问来源于stack exchange,提问作者default
相关产品推荐
相关产品推荐

