为什么这个易失性变量的地址总是在1

Why is the address of this volatile variable always at 1?

本文关键字:地址 易失性 变量 为什么      更新时间:2023-10-16

我想检查变量

的地址
volatile int clock;
cout << &clock;

但是它总是说x在地址1。我做错什么了吗?

iostreams将大多数指针强制转换为void *以显示-但volatile指针不存在转换。因此,c++退回到隐式强制转换到bool。如果要打印地址,则显式转换为void*:

std::cout << (void*)&clock;

对于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 << "pointern";
}
void foo(bool a) {
    std::cout << "booln";
}
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 pointern";
}
输出:

bool
1
pointer
0x22cd28
now it's a pointer

这是因为operator <<没有接受指向volatile的指针的重载,也没有可以满足它的指针转换。

根据c++标准,

对于任何类型T,指向T的指针、指向const T的指针和指向volatile T的指针都被认为是不同的参数类型,对T的引用、对const T的引用和对volatile T的引用也是不同的。

操作符<<对指向非静态成员的指针、指向volatile的指针或函数指针没有重载,因此试图输出这些对象会调用隐式转换到bool