我正在读一本关于C ++的书,上面写着如果我使用>>运算符它返回运算符左侧的对象,因此在此示例中
std::cin >> value1;
代码返回std::cin
。
但如果我这样做
while(std::cin >> value1)
我的代码将在循环中,直到出现std::cin
错误,这意味着运算符返回bool
,std::cin
在std::cin
未失败时为真,在shell=True
时为{ {1}}失败。
这是一个吗?
答案 0 :(得分:48)
[...]因此必须表示操作员返回bool [...]
不,它返回std::cin
(通过引用)。 while(std::cin >> value);
之所以有效,是因为std::istream
(std::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
的上下文中使用时,也会忽略限定符,如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
答案 1 :(得分:21)
std::istream
(std::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::cin
(std::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
),但仍然会在explicit
或bool
中隐式转换为if
。
这个问题的答案是while
或if
使用显式转换&#34;含蓄地&#34;。 (见this answer by @R. Martinho Fernandes)。因此while
,if
和while
是此&#34; 上下文转换&#34;的地方之一隐含地发生for
。