Существует 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