2011-06-08 31 views
6

一个代码等流输出和隐性无效*转换运算功能调用

cin>> grade; 

其中等级是一个标准数据类型返回参照CIN(IStream对象),使级联的输入....
但我看,如果

cin >>grade; 

用作条件while语句说...流的void *的类型转换操作符函数隐式调用......并把它转换参考IStream对象变成非空或取决于成功的空指针SS或最后输入操作失败...和空指针转换为假,非空真...我的问题是:

  1. 什么是void *的类型转换操作符的功能,它是如何在这里工作
  2. 非空指针是如何转化为真,空假
+0

只需注意为什么这是有用的:它允许你像'while(cin >> x){/ *用x * /}做东西'循环。 – 2011-06-08 11:09:13

回答

10

1.什么是void *的类型转换操作符的功能,它是如何在这里工作

它升ooks是这样的:

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

的问题是:为什么不在这里使用的operator bool?答案是:因为这会导致可能隐藏错误的无效转换。以上是safe bool idiom的示例。

但是,这种实现实际上已经过时。这个习惯用法有更好的实现;文章解释他们。

2.how是转化为真实,空非空指针错误

这是C多么++工作原理:任何非空指针在有条件视为等同于true。现在,为什么C++首先在这里调用operator void*

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

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

+0

@Konrad:这是不够的 - >'return fail()? 0:这个;'? – Nawaz 2011-06-08 11:22:58

+0

@Nawaz不确定,也懒得去检查。 ?:禁止不兼容类型之间的隐式转换。也许'0'的类型在这里被正确地推断为'basic_istream *'。但无论哪种方式,演员都明确表示这一点 – 2011-06-08 11:26:51

+0

@Konrad:是的。由于隐式转换,“0”与任何类型的指针兼容。这就是它经常用作任何类型的NULL指针的原因。 'std :: istream * p = 0;','std :: string * s = 0;','void * v = 0;'一切正常。无论如何,+1为好的答案。 – Nawaz 2011-06-08 11:32:25