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

时间:2011-06-08 11:00:16

标签: c++

这样的代码
cin>> grade;

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

cin >>grade;

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

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

1 个答案:

答案 0 :(得分:10)

  

1. void * cast运算符函数是什么?它在这里是如何工作的

它看起来像这样:

operator void* () const {
    return fail() ? 0 : this;
}

问题是:为什么这里不使用operator bool?答案是:因为这允许无效的转换,这可能隐藏错误。以上是safe bool idiom的一个例子。

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

  

2.how将非空指针转换为true,将null转换为false

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

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

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