我正在读一本关于C++的书,它说如果我使用>>运算符,它会返回运算符左侧的对象,所以在这个例子中
Run Code Online (Sandbox Code Playgroud)std::cin >> value1;
代码返回std::cin.
但是,如果我这样做
while(std::cin >> value1)
Run Code Online (Sandbox Code Playgroud)
我的代码将处于循环中,直到出现std::cin错误,因此必须表示运算符bool在std::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)
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)
如果对象处于错误状态,则返回空指针,用于相同目的.
| 归档时间: |
|
| 查看次数: |
3079 次 |
| 最近记录: |