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

时间:2016-08-16 14:59:05

标签: c++ cin

我正在读一本关于C ++的书,上面写着如果我使用>>运算符它返回运算符左侧的对象,因此在此示例中

std::cin >> value1;

代码返回std::cin

但如果我这样做

while(std::cin >> value1)

我的代码将在循环中,直到出现std::cin错误,这意味着运算符返回boolstd::cinstd::cin未失败时为真,在shell=True时为{ {1}}失败。

这是一个吗?

4 个答案:

答案 0 :(得分:48)

  

[...]因此必须表示操作员返回bool [...]

不,它返回std::cin(通过引用)。 while(std::cin >> value);之所以有效,是因为std::istreamstd::cin的类型)有conversion operator

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

<子> [std::ios_base::operator bool()]

  

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

explicit operator bool() const;

请注意,即使运算符为explicit(不应允许隐式转换,如if (std::cin);),在需要bool的上下文中使用时,也会忽略限定符,如ifwhile循环和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

答案 1 :(得分:21)

std::istreamstd::cin是其对象的类)具有以下成员函数:

explicit operator bool() const;

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

operator void*() const;

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

答案 2 :(得分:3)

对流的操作会返回对流的引用。

所以,不是startAnimationSequence

您可以将结果粘贴到bool条件中,原因与您可以执行此操作相同:

if

就此而言:

void* ptr = foo();
if (ptr) { /*...*/ }

此处的int x = foo(); if (x) { /*...*/ } ptr都可以转换x,以便在条件中使用。对于bool,转化是通过std::cin类中的operator bool()实现的,该std::ostream类为此确切任务添加了明确(双关语)。

答案 3 :(得分:1)

<Collapse isOpened={this.state.isOpened} keepCollapsedContent={true}> //content here </Collapse> 的类型为std::cinstd::basic_istream<char>只是std::istream}

如果您看到different overloaded operator>> for basic_istream,则所有人都会返回对typedef的引用。因此有一件事情已被清除,basic_istream在这里,并没有返回operator>>,而是返回&#34; bool&#34;本身。您不会看到任何std::cin返回operator>>值。

现在的问题是,它如何将bool转换为std::basic_istream
答案是:为此目的正在调用转换运算符

bool从其父std::basic_istream

继承operator bool()
std::basic_ios

可以将explicit operator bool() const; 对象转换为std::basic_istream。 人们可以很容易地想知道它已标记为bool(请参阅why is it marked explicit),但仍然会在explicitbool中隐式转换为if

这个问题的答案是whileif使用显式转换&#34;含蓄地&#34;。 (见this answer by @R. Martinho Fernandes)。因此whileifwhile是此&#34; 上下文转换&#34;的地方之一隐含地发生for