que querían inspeccionar la dirección de mi variable de¿Por qué la dirección de esta variable volátil siempre está en 1?
volatile int clock;
cout << &clock;
Pero siempre dice que x es en la dirección 1. ¿Estoy haciendo algo mal ??
que querían inspeccionar la dirección de mi variable de¿Por qué la dirección de esta variable volátil siempre está en 1?
volatile int clock;
cout << &clock;
Pero siempre dice que x es en la dirección 1. ¿Estoy haciendo algo mal ??
iostreams arrojarán la mayoría de los apuntadores a void *
para su visualización, pero no existe ninguna conversión para volatile
punteros. Como tal, C++ vuelve al molde implícito a bool
. Fundido a void*
explícitamente si desea imprimir la dirección:
std::cout << (void*)&clock;
¿Pensé que la conversión funciona automáticamente? –
Sí, hay una conversión automática. Es solo que se convierte automáticamente en 'bool', no' void * ', ya que C++ no tiene conversión automática a' void * 'para punteros (C lo hace, pero C++ requiere un molde explícito) – bdonlan
¡Oh! ¡Johannes es humano también! –
Hay un operator<<
para const void*
, pero no hay operator<<
para volatile void*
, y la conversión implícita no eliminará volatile
(no eliminará const
tampoco).
Como dice GMan, la calificación cv del tipo señalado debería ser irrelevante para el negocio de impresión de una dirección. Quizás la sobrecarga definida en 27.7.3.6.2 debería ser 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
Batirme literalmente un segundo, urg :(.Para agregar: en la solución propuesta por bdonlan, el molde de estilo c como 'const_cast'. Con el propósito de imprimir, no es realmente una preocupación. – GManNickG
Esto se debe a que no hay sobrecarga para operator <<
que toma un puntero a volatile
, y no hay conversión puntero que podría satisfacerla.
Según el estándar de C++,
para cualquier tipo
T
, puntero aT
, puntero aconst T
, y el puntero avolatile T
se consideran tipos de parámetros distintos, como son referencia aT
, la referencia aconst T
, y referencia avolatile T
.
Operator <<
has no overload for pointers to non-static member, punteros a, o punteros de función volátiles, por lo que el intento de salida tales objetos invoca conversión implícita a bool
.
* 1 * no siempre debe representar el valor numérico, también podría ser lógico. – Kris