static_cast ejemplo dynamic_cast const_cast c++ iostream implicit-conversion cout memory-address

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