2011-11-23 55 views

回答

18

iostreams會將大部分指針指向void *進行顯示 - 但是對於volatile指針不存在任何轉換。因爲這樣的C++可以回溯到隱含的轉換爲bool。投射到void*明確,如果你要打印的地址:

std::cout << (void*)&clock; 
+0

我認爲轉換工作是自動的? –

+0

是的,有一個自動轉換。它只是自動轉換爲'bool',而不是'void *',因爲C++沒有自動轉換爲void *指針(C是,但C++需要顯式轉換) – bdonlan

+7

哦!約翰尼斯也是人類! –

17

有用於const void*operator<<,但沒有operator<<volatile void*,並且隱式轉換不會刪除volatile(它不會刪除const要麼)。

正如GMan所說,指出的類型的簡歷資格應該與打印地址的業務無關。也許27.7.3.6.2中定義的超載應該是operator<<(const volatile void* val);,我不能馬上看到任何缺點。但事實並非如此。

#include <iostream> 

void foo(const void *a) { 
    std::cout << "pointer\n"; 
} 

void foo(bool a) { 
    std::cout << "bool\n"; 
} 

int main() { 
    volatile int x; 
    foo(&x); 
    std::cout << &x << "\n"; 
    int y; 
    foo(&y); 
    std::cout << &y << "\n"; 
    void foo(volatile void*); 
    foo(&x); 
} 

void foo(volatile void *a) { 
    std::cout << "now it's a pointer\n"; 
} 

輸出:

bool 
1 
pointer 
0x22cd28 
now it's a pointer 
+0

擊敗我的一秒鐘,urg :(。補充:在bdonlan提出的解決方案中,將c風格轉換爲const_cast。爲了印刷的目的,這不是真正的問題。 – GManNickG

0

這是因爲存在用於operator <<沒有過載,需要一個指針volatile,並且不存在指針轉換可能滿足它。

根據C++標準,

任何類型T,指針T,指針const T,和指針volatile T被認爲是不同的參數類型,因爲是參考T,參照const T,和參考到volatile T

Operator << has no overload for pointers to non-static member,指針到易失性或功能指針,所以試圖輸出這樣的對象調用的隱式轉換到bool