像这样的代码
cin>> grade;
grade是标准数据类型返回对cin(istream对象)的引用,它启用级联输入….
但我读到了如果
cin >>grade;
在while语句中用作条件…流的void * cast运算符函数被隐式调用…并且它将对istream对象的引用转换为非null或空指针,具体取决于上一次输入操作的成功或失败…并将空指针转换为false,将非null转换为true …我的问题是:
>什么是void * cast操作符函数以及它在这里是如何工作的
>如何将非空指针转换为true并将null转换为false
解决方法
1.what is the void * cast operator function and how does it work here
它看起来像这样:
operator void* () const { return fail() ? 0 : this; }
问题是:为什么不是这里使用的运算符bool?答案是:因为这允许无效的转换,这可能隐藏错误.以上是safe bool idiom的一个例子.
但是,这种实现实际上已经过时了.这个成语存在更好的实现;文章解释了他们.
2.how is non-null pointer converted to true and null to false
这就是C的工作原理:任何非空指针都被视为在条件中等效为true.现在,为什么C首先在这里调用操作符void *?
实质上,当C看到一个意外类型的对象时,它会尝试应用一个隐式转换,使该对象类型在此上下文中有效.因此,编译器会尝试所有可用的隐式转换,并查看在此上下文中结果类型是否可接受.
这发生在她身上:编译器看到while(cin>> grade).它知道basic_istream在while条件的上下文中无效.因此它发现有一个运算符void *,并且void *在此上下文中有效,因此C应用此转换.