2011-11-23 60 views

Respuesta

18

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; 
+0

¿Pensé que la conversión funciona automáticamente? –

+0

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

+7

¡Oh! ¡Johannes es humano también! –

17

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 
+0

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

0

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 a T, puntero a const T, y el puntero a volatile T se consideran tipos de parámetros distintos, como son referencia a T, la referencia a const T, y referencia a volatile 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.

Cuestiones relacionadas