【发布时间】:2012-01-04 13:44:04
【问题描述】:
我想检查我的变量的地址
volatile int clock;
cout << &clock;
但它总是说 x 在地址 1。我做错了什么吗??
【问题讨论】:
-
1 不必总是代表数值——也可以是合乎逻辑的。
标签: c++ iostream implicit-conversion cout memory-address
我想检查我的变量的地址
volatile int clock;
cout << &clock;
但它总是说 x 在地址 1。我做错了什么吗??
【问题讨论】:
标签: c++ iostream implicit-conversion cout memory-address
iostreams 会将大多数指针转换为 void * 以供显示 - 但 volatile 指针不存在转换。因此,C++ 回退到隐式转换为bool。如果要打印地址,请显式转换为void*:
std::cout << (void*)&clock;
【讨论】:
bool,而不是void *,因为C++ 没有针对指针自动转换为void *(C 有,但C++ 需要显式转换)
void*,它是void* 到T*,需要强制转换。
T* 到 void* 的转换是隐式的。
T* 隐式转换为void*。所写的答案是错误的,或者至少是不完整的; C++ 不支持的是隐式抛弃volatile。
volatile 指向volatile 对象的指针完全允许volatile 应该阻止的那种内存缓存?
const void* 有一个operator<<,但volatile void* 没有operator<<,隐式转换不会删除volatile(它也不会删除const)。
正如 GMan 所说,指向的类型的 cv 限定应该与打印地址的业务无关。也许 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
【讨论】:
const_cast。出于打印的目的,它并不是真的担心。
这是因为operator << 没有重载,它接受指向volatile 的指针,并且没有指针转换可以满足它。
根据 C++ 标准,
对于任何类型
T、指向T、指向const T和指向volatile T的指针都被视为不同的参数类型,对T的引用、对const T的引用和引用到volatile T。
Operator << has no overload for pointers to non-static member,指向 volatile 的指针或函数指针,因此尝试输出此类对象会调用到 bool 的隐式转换。
【讨论】: