为什么这个易失性变量的地址总是在1
Why is the address of this volatile variable always at 1?
我想检查变量
的地址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
。
相关文章:
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 使用易失性 c 字符串和 std::cout
- 易失性结构 = 结构不可能,为什么?
- 如何强制 GCC 以线性方式转换易失性内联程序集语句
- 我可以使用互斥锁或关键字(静态)代替C++中的易失性吗?
- 为什么这个易失性变量的地址总是在1