私は私の変数この揮発性変数のアドレスが常に1になっているのはなぜですか?
volatile int clock;
cout << &clock;
のアドレスを検査したかった。しかし、それは常にxはアドレスに1アム私は何か間違ったことをやっていると言っています?
私は私の変数この揮発性変数のアドレスが常に1になっているのはなぜですか?
volatile int clock;
cout << &clock;
のアドレスを検査したかった。しかし、それは常にxはアドレスに1アム私は何か間違ったことをやっていると言っています?
iostreamsはほとんどのポインタをvoid *
にキャストしますが、volatile
ポインタの変換はありません。このようにC++は暗黙のキャストに戻ってbool
にキャストします。 (それはconst
は削除されませんどちらか)
std::cout << (void*)&clock;
私は変換が自動的に動作すると思いましたか? –
はい、自動変換があります。 C++はポインタのための 'void * 'への自動変換を持っていないので(Cは行いますが、C++は明示的キャストが必要です) – bdonlan
ああ、それは自動的に' void * 'ではなく' bool'に変換されます。ヨハネスも人間です! –
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
文字通り1秒で私を打つ、urg :(。追加する:bdonlanによって提案されたソリューションでは、cスタイルは 'const_cast'としてキャストされます。印刷の目的のために、それは本当に心配していません。 – GManNickG
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
に暗黙的な変換を呼び出します。
* 1 *は必ずしも数値を表す必要はなく、論理的でもよい。 – Kris