当读取错误的类型时,cin会覆盖我的初始化值?

Ale*_*sse 4 c++ cin language-lawyer c++11

所以这是一个非常基本的问题和超级微不足道的但我只是通过c ++中的编程原则和实践,我的程序用于读取字符串和int的行为与Bjarne Stroustrup编写的书不同,所以如果他感到惊讶犯了一个错误.无论如何这里是代码:

#include "..\std_lib_facilities.h"

int main()
{
    cout << "Please enter your first name and age\n";
    string first_name = "???"; // string variable
                               // ("???” means “don’t know the name”)
    int age = -1;              // integer variable (1 means “don’t know the age”)
    cin >> first_name >> age;  // read a string followed by an integer
    cout << "Hello, " << first_name << " (age " << age << ")\n";
}
Run Code Online (Sandbox Code Playgroud)

当我在提示符输入"22 Carlos"时它输出"Hello,22(0岁)",基本上使我的错误检查的初始化值无用.这是c ++或其他东西的新功能,这就是为什么这本书出错了?

编辑1:BTW我在Windows 7上使用GCC for cygwin,并且-std = c ++ 11触发器.

son*_*yao 6

这是自C++ 11以来std :: basic_istream :: operator >>的一个新特性:

如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit.(直到C++ 11)

如果提取失败,则将零写入值并设置failbit.(自C++ 11以来)

您应该检查流的状态,例如

if (cin >> age) {
    ... fine ....
} else {
    ... fails ...
}
Run Code Online (Sandbox Code Playgroud)