Что такое 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 79

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 изначально имеет тип"cvT", где T резюме-неквалифицированный номера-класса, номера-тип массива, тип выражение настраивается на T перед любым дальнейшим анализом.

однако, это сам допустимый тип и происходит, например,C-стандартные библиотечные функции, где он используется для обеспечения const-корректности указателей аргументов:int const* не может быть преобразован в void*, а void const*.

типы могут быть результатом шаблонов; шаблон может указывать const T, и быть создан с T как void.

связанный ответ вводится в заблуждение или, скорее, ограничен ввиду того, что он касается особого случая типа без шаблона, и даже тогда const void может быть бессмысленно, но это код.