const_cast - dynamic_cast c++ ejemplo
¿Por qué la dirección de esta variable volátil está siempre en 1? (3)
Esto se debe a que no hay una sobrecarga para el operator <<
que lleva un puntero a volatile
y no hay una conversión de puntero que pueda satisfacerla.
Según el estándar C ++,
para cualquier tipo
T
, el puntero aT
, el puntero aconst T
y el puntero avolatile T
se consideran tipos de parámetros distintos, como referencia aT
, referencia aconst T
y referencia avolatile T
El operador <<
no tiene sobrecarga para los punteros a miembros no estáticos , los punteros a volátiles o los punteros de función, por lo que intentar generar tales objetos invoca la conversión implícita a bool
.
Quería inspeccionar la dirección de mi variable
volatile int clock;
cout << &clock;
Pero siempre dice que x está en la dirección 1. ¿Estoy haciendo algo mal?
Hay un operator<<
para const void*
, pero no hay operator<<
para volatile void*
, y la conversión implícita no eliminará volatile
(tampoco eliminará const
).
Como dice GMan, la calificación de CV del tipo al que se apunta debe ser irrelevante para el negocio de imprimir una dirección. Quizás la sobrecarga definida en 27.7.3.6.2 debería ser el operator<<(const volatile void* val);
, No puedo ver inmediatamente ninguna desventaja. Pero no lo es.
#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";
}
Salida:
bool
1
pointer
0x22cd28
now it''s a pointer
iostreams emitirá la mayoría de los punteros para void *
para su visualización, pero no existe conversión para volatile
punteros volatile
. Como tal, C ++ recurre a la conversión implícita a bool
. Anular void*
explícitamente si desea imprimir la dirección:
std::cout << (void*)&clock;