2011-11-23 13 views

答えて

18

iostreamsはほとんどのポインタをvoid *にキャストしますが、volatileポインタの変換はありません。このようにC++は暗黙のキャストに戻ってboolにキャストします。 (それはconstは削除されませんどちらか)

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

私は変換が自動的に動作すると思いましたか? –

+0

はい、自動変換があります。 C++はポインタのための 'void * 'への自動変換を持っていないので(Cは行いますが、C++は明示的キャストが必要です) – bdonlan

+7

ああ、それは自動的に' void * 'ではなく' bool'に変換されます。ヨハネスも人間です! –

17

const void*ためoperator<<ありますが、volatile void*にはoperator<<はありません、との暗黙的な変換がvolatileを削除することはできません:あなたはアドレスを印刷したい場合は、明示的にvoid*にキャストします。

GManによれば、指摘されているタイプのcv-qualificationは、アドレスを印刷するビジネスとは関係がありません。おそらく、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

文字通り1秒で私を打つ、urg :(。追加する:bdonlanによって提案されたソリューションでは、cスタイルは 'const_cast'としてキャストされます。印刷の目的のために、それは本当に心配していません。 – GManNickG

0

volatileへのポインタを取るoperator <<ための過負荷がなく、かつ、それを満たすことができ一切ポインタ変換が存在しないためです。 Tを参照し、const Tを参照し、参照されているようなC++標準によれば

volatile Tに任意のタイプT、ポインタTに、ポインタconst Tに、ポインタ用

は、異なるパラメータの型とみなされます〜volatile T。そう出力ようなオブジェクトにしようと

Operator << has no overload for pointers to non-static member、揮発性、または関数ポインタへのポインタは、boolに暗黙的な変換を呼び出します。

関連する問題