我想检查变量的地址
volatile int clock;
cout << &clock;
但是它总是说x在地址1.我做错了吗?
答案 0 :(得分:18)
iostream会将大多数指针投射到void *
以供显示 - 但volatile
指针不存在转换。因此,C ++回归到bool
的隐式转换。如果要打印地址,请明确地转换为void*
:
std::cout << (void*)&clock;
答案 1 :(得分:17)
operator<<
有一个const void*
,但operator<<
没有volatile void*
,隐式转化不会删除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
答案 2 :(得分:0)
这是因为Parent : 000691195
CUSTNO : 115225036-AD
COMPANY : BROOK FURNITURE RENTAL
ADDRESS1 : 100 N FIELD DR
city : LAKE FOREST
STATE : IL
ZIP : 600452580
Parent : 000691195
CUSTNO : 116952265-AD
COMPANY : BROOK FURNITURE RENTAL
ADDRESS1 : 100 N FIELD DR STE 220
city : LAKE FOREST
STATE : IL
ZIP : 600452598
没有超载,它指向operator <<
,并且没有指针转换可以满足它。
根据C ++标准,
对于任何类型
volatile
,指向T
的指针,指向T
的指针和指向const T
的指针都被视为不同的参数类型,参考volatile T
},引用T
,并引用const T
。
Operator <<
has no overload for pointers to non-static member,指向volatile或函数指针的指针,因此尝试输出此类对象会调用隐式转换为volatile T
。