为什么这个volatile变量的地址始终为1?

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)

  • @bdonlan很抱歉,但是C++确实将`T*`隐式转换为`void*`.写的答案是错误的,或者至少是不完整的; C++不支持的是隐式抛弃`volatile`. (7认同)
  • @bdonlan:你已经倒退了.任何普通的指针都可以隐式转换为`void*`,它是`void*`到`T*`需要强制转换. (3认同)

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)