流输出和隐式void*转换操作符函数调用

Avi*_*mar 6 c++

像这样的代码

cin>> grade;
Run Code Online (Sandbox Code Playgroud)

grade是标准数据类型返回对cin(istream对象)的引用,它启用了级联输入....
但我读到了

cin >>grade;
Run Code Online (Sandbox Code Playgroud)

在while语句中用作条件...流的void*cast运算符函数被隐式调用...并且它将对istream对象的引用转换为非null或空指针,具体取决于上一次输入操作的成功或失败...并将空指针转换为false,将非null转换为true ...我的问题是:

  1. 什么是void*cast操作符函数以及它在这里是如何工作的
  2. 如何将非空指针转换为true并将null转换为false

Kon*_*lph 10

1.什么是void*cast操作符函数以及它在这里是如何工作的

它看起来像这样:

operator void* () const {
    return fail() ? 0 : this;
}
Run Code Online (Sandbox Code Playgroud)

问题是:为什么不在operator bool这里使用?答案是:因为这允许无效的转换,这可能隐藏错误.以上是安全布尔成语的一个例子.

但是,这种实现实际上已经过时了.这个成语存在更好的实现; 文章解释了他们.

2.how是非空指针转换为true而null为false

这就是C++的工作原理:任何非空指针都被视为等效true于条件.现在,为什么C++首先调用operator void*这里?

本质上,当C++看到一个意外类型的对象时,它会尝试应用一个隐式转换,使该对象类型在此上下文中有效.因此,编译器会尝试所有可用的隐式转换,并查看在此上下文中结果类型是否可接受.

这发生在她身上:编译器看到了while (cin >> grade).它知道basic_istreamwhile条件的上下文中无效.因此,发现有一个operator void*,并且void* 在这种情况下有效,以便C++应用这种转换.