Что такое const void?
описание std::is_void
гласит:
предоставляет постоянное значение члена, равное true, если T -тип void, const void, volatile пустота, или const volatile void.
тогда что может быть const void
или volatile void
?
в этом ответе говорится, что const void
тип возврата будет недействительным (однако компилируется на VC++ 2015)
const void foo() { }
если по стандарту, const void
is недопустимый (VC ошибается) - тогда что такое const void
?
3 ответа:
const void
- Это тип, на который можно сформировать указатель. Это похоже на обычный указатель void, но преобразования работают по-разному. Например,const int*
не может быть неявно преобразован вvoid*
, но он может быть неявно преобразован вconst void*
. Аналогично, если у вас естьconst void*
вы не можетеstatic_cast
доint*
, но вы можетеstatic_cast
до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
как
void
,const void
- Это тип void. Однако, еслиconst void
это возвращение тип,const
- это бессмысленно (хотя и законно!), потому что [expr] / 6:если prvalue изначально имеет тип"cv
T
", гдеT
резюме-неквалифицированный номера-класса, номера-тип массива, тип выражение настраивается наT
перед любым дальнейшим анализом.однако, это сам допустимый тип и происходит, например,C-стандартные библиотечные функции, где он используется для обеспечения const-корректности указателей аргументов:
int const*
не может быть преобразован вvoid*
, аvoid const*
.