2011-06-08 23 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