Jeśli spróbujesz zmienić wskaźnik na typ ulotny, nawet zmienny wskaźnik znaku, w którym normalnie spodziewałbyś się wydrukować ciąg, zamiast tego po prostu otrzymasz "1" (zakładając, że wskaźnik nie jest pusty). Zakładam, że operator strumienia wyjściowego < < jest szablonem specjalizującym się w zmiennych wskaźnikach, ale moje pytanie brzmi: dlaczego? Jaki przypadek użycia motywuje to zachowanie?Dlaczego std :: cout konwertuje zmienne wskaźniki na bool?
Przykładowy kod:
#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;
}
wyjściowa:
Hello world
1
0x8046b6c
1
+1 dokładniej wskaźnik do ulotnej pamięci, lotny wskaźnik byłby 'char * volatile' zamiast' char volatile * ' –
Oczywiście możesz dodać przeciążenie funkcji' operator << (ostream & os, volatile void * p) {return os << const_cast (p);} 'i bądź z nim przez cały czas .. –
Potatoswatter
@Potatoswatter Odrzucanie zmienności wskazanego obiektu, aby uzyskać dostęp do obiektu, jakby był nieulotny [jest nieokreślonym zachowaniem] (https://stackoverflow.com/a/24555400/1038860), niestety. (Chyba, że wskazany obiekt [nie był pierwotnie] (https://stackoverflow.com/a/7368038/1038860) lotny.) –