Opis std::is_void
stwierdza, że:
Zapewnia stałą składową, która jest równa true, jeśli T jest typem void, const void, volatile void lub const volatile void.
Więc co mogłoby być const void
, lub volatile void
?
Ta odpowiedź stwierdza, że const void
zwracany typ byłby nieprawidłowy (jednak kompiluje się na VC ++ 2015)
const void foo() { }
Jeśli standardowo const void
jest nieprawidłowy (VC jest błędny) - to co jest const void
?
void
bez niejconst
”.void
Odpowiedzi:
const void
jest typem, do którego można utworzyć wskaźnik. Jest podobny do zwykłego wskaźnika void, ale konwersje działają inaczej. Na przykładconst int*
nie można niejawnie przekonwertować na plikvoid*
, ale można go niejawnie przekonwertować na plikconst void*
. Podobnie, jeśli masz aconst void*
, nie możeszstatic_cast
tego zrobićint*
, ale możeszstatic_cast
to zrobićconst int*
.const int i = 10; void* vp = &i; // error const void* cvp = &i; // ok auto ip = static_cast<int*>(cvp); // error auto cip = static_cast<const int*>(cvp); // ok
źródło
const void
, ale jej wszystkie wokół wskaźników pustki i nie-pustki [z (nie) stałością].const void*
to jedyny powód, jaki kiedykolwiek zobaczyszconst void
. Może być przekazywany jako argument szablonu, ale instancja tego typu argumentu będzie zawsze tworzona tylko z literą*
na końcu.const void
w pytanie zadawane przez prawnika językowejconst void
jest to, że można tworzyć wszystkie typy w C ++const
. „Istnieje” w taki sam sposób, w jakivoid
istnieje. Odpowiedź @Benjamina Lindleya wyjaśnia, co to jest, kiedy ją widzisz i jak jej używasz.Jako
void
,const void
jest nieważna typu. Jeśli jednakconst void
jest typem zwracanym , toconst
jest bez znaczenia (aczkolwiek legalne!), Ponieważ [wyrażenie] / 6 :Jednak sam jest prawidłowym typem i występuje np. W funkcjach bibliotecznych w standardzie C , gdzie jest używany do zapewnienia stałej poprawności wskaźników argumentów:
int const*
nie można konwertować navoid*
, alevoid const*
.źródło
const void
ponieważ typ zwracany wpływa na typ funkcji, więc nie jest całkowicie bez znaczenia.Typy mogą wynikać z szablonów; szablon może zawierać
const T
i być utworzony zT
asvoid
.Połączona odpowiedź jest myląca, a raczej ograniczona, ponieważ dotyczy specjalnego przypadku typu innego niż szablon, a nawet wtedy
const void
może być bez znaczenia , ale jest to prawidłowy kod .źródło