Si intenta utilizar un puntero a un tipo volátil, incluso un puntero de carácter volátil donde normalmente esperaría que cout imprima la cadena, simplemente obtendrá '1' (asumiendo que el puntero no es nulo, creo). Supongo que el operador de flujo de salida < < es una plantilla especializada para punteros volátiles, pero mi pregunta es, ¿por qué? ¿Qué caso de uso motiva este comportamiento?¿Por qué std :: cout convierte los punteros volátiles en bool?
código Ejemplo:
#include <iostream>
#include <cstring>
int main()
{
char x[500];
std::strcpy(x, "Hello world");
int y;
int *z = &y;
std::cout << x << std::endl;
std::cout << (char volatile*)x << std::endl;
std::cout << z << std::endl;
std::cout << (int volatile*)z << std::endl;
return 0;
}
Salida:
Hello world
1
0x8046b6c
1
+1 más precisamente un puntero a la memoria volátil, un puntero volátil sería 'char * volátil' en lugar de' char volatile * ' –
Por supuesto, puede agregar una función libre sobrecarga' operador << (ostream & os, volátil void * p) {return os << const_cast (p);} 'y terminarlo. –
Potatoswatter
@Potatoswatter Eliminar la volatilidad del objeto apuntado para acceder al objeto como si no fuera volátil [es un comportamiento indefinido] (https://stackoverflow.com/a/24555400/1038860), desafortunadamente. (A menos que el objeto apuntado [no fue originalmente] (https://stackoverflow.com/a/7368038/1038860) volátil.) –