std :: cin如何同时返回bool和它本身?

gig*_*igi 32 c++ cin

我正在读一本关于C++的书,它说如果我使用>>运算符,它会返回运算符左侧的对象,所以在这个例子中

std::cin >> value1;
Run Code Online (Sandbox Code Playgroud)

代码返回std::cin.

但是,如果我这样做

while(std::cin >> value1)
Run Code Online (Sandbox Code Playgroud)

我的代码将处于循环中,直到出现std::cin错误,因此必须表示运算符boolstd::cin未失败时返回true,在失败时返回false std::cin.

哪一个是它?

Rak*_*111 51

[...]所以必须意味着操作员返回一个bool [...]

不,它返回std::cin(通过引用).之所以while(std::cin >> value);工作是因为std::istream(它的类型std::cin)有一个转换运算符.

转换运算符基本上允许将类隐式(如果未标记explicit)转换为给定类型.在这种情况下,std::istream定义它operator bool以返回是否发生错误(通常failbit);

[std::ios_base::operator bool()]

返回true如果流没有错误并准备进行I/O操作.具体来说,回报!fail().


explicit operator bool() const;
Run Code Online (Sandbox Code Playgroud)

注意,除了即使操作者是explicit(这不应该允许像隐式转换if (std::cin);中,需要一个一个语境中使用),限定词被忽略bool,比如if,while环路和for环路.这些是例外,而不是规则.

这是一个例子:

if (std::cin >> value);  //OK, a 'std::istream' can be converted into a 'bool', which 
                         //therefore happens implicitly, without the need to cast it: 

if (static_cast<bool>(std::cin >> value)); //Unnecessary

bool b = std::cin >> value;  //Error!! 'operator bool' is marked explicit (see above), so 
                             //we have to call it explicitly:

bool b = static_cast<bool>(std::cin >> value); //OK, 'operator bool' is called explicitly
Run Code Online (Sandbox Code Playgroud)

  • 我认为除了规则的例外之外,添加像例如`bool good = std :: cin;`这样的非异常是有用的,它正确地不能编译. (2认同)
  • 很棒的解释.可能更简单地说,将任何表达式放在"if"或"while"条件*中是一个相当明确的强制转换为bool. (2认同)

Ben*_*ley 21

std::istream(std::cin作为对象的类)具有以下成员函数:

explicit operator bool() const;
Run Code Online (Sandbox Code Playgroud)

如果对象处于错误状态,则返回false,否则返回true.这就是while(std::cin >> value1)构造工作的原因.在C++ 11之前,它有这个非显式函数:

operator void*() const;
Run Code Online (Sandbox Code Playgroud)

如果对象处于错误状态,则返回空指针,用于相同目的.