Joh*_*itb 22 c++ iostream cout memory-address implicit-conversion
我想检查变量的地址
volatile int clock;
cout << &clock;
Run Code Online (Sandbox Code Playgroud)
但它总是说x在地址1.我做错了什么?
bdo*_*lan 20
iostreams会将大多数指针转换void *为显示 - 但volatile指针不存在转换.因此,C++回归到隐式转换为bool.void*如果要打印地址,请明确转换为:
std::cout << (void*)&clock;
Run Code Online (Sandbox Code Playgroud)
Ste*_*sop 17
有一个operator<<for const void*,但没有operator<<for 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";
}
Run Code Online (Sandbox Code Playgroud)
输出:
bool
1
pointer
0x22cd28
now it's a pointer
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |