格式化提取失败后使用值安全吗? 这是一个比较简单的问题,但是我在读C++标准27.7.2.2.2[ISTRAM.格式化,算术]时,找不到一个明确的答案,在所有的水龙头中都丢失了。< /P>

格式化提取失败后使用值安全吗? 这是一个比较简单的问题,但是我在读C++标准27.7.2.2.2[ISTRAM.格式化,算术]时,找不到一个明确的答案,在所有的水龙头中都丢失了。< /P>,c++,C++,如果格式化提取(std::istream>>值)失败,使用值是否安全?如果提取失败,是否始终不修改该值?例如,以下代码是否合法和安全 #include <iostream> #include <sstream> int main() { int value = 0; std::stringstream ss("Hello world!"); ss >> value; // this will fail // will va

如果格式化提取(
std::istream>>值
)失败,使用
是否安全?如果提取失败,是否始终不修改该值?例如,以下代码是否合法和安全

#include <iostream>
#include <sstream>

int main()
{
    int value = 0;
    std::stringstream ss("Hello world!");

    ss >> value; // this will fail

    // will value still be guaranteed to be zero?
    std::cout << "value is " << value << std::endl;
}
#包括
#包括
int main()
{
int值=0;
std::stringstream ss(“你好,世界!”);
ss>>value;//这将失败
//该值仍保证为零吗?
std::cout快速研究:

至少在某些编译器上是这样,因此实际上无法保证istream的行为。

在C++03中,由于scanf系列的定义,失败的输入是UB(UB意味着您也不能依赖错误报告,例如十六进制输入的数字太多)

有一个明显的保证,但它是无效的UB


这是在C++11中修复的,例如使用strtoll。

我相信在C++14中语义已经改变,但通常情况下,在提取失败后,您应该将目标变量视为不可读。如果没有其他问题,则应采取逻辑态度。此程序是否终止?hello world之后没有换行符。不会传递输入命令。例如:tegral类型,它们被设置为
0
。对于字符类型,它们保持初始化状态。对于
std::string
,它被清除。(至少我可以从N3797中确定这一点)@KerrekSB:我完全同意,在实践中,值应该被视为不可读。不幸的是,有时我们必须维护不符合最佳实践的代码,并且需要知道这样奇怪的事情…@KerrekSB,AFAIK,事情在C++11中被归零。这是您所想的更改,还是在这上面还有其他更改T