Подтвердить что ты не робот

Что такое const void?

Описание std::is_void гласит, что:

Предоставляет постоянное значение члена, равное true, если T является типом типа, const void, volatile void, или const volatile void.

Тогда что может быть const void, или volatile void?

В этом ответе указано, что тип возвращаемого типа const void недействителен (однако компилируется на VС++ 2015)

const void foo() { }

Если по стандарту const void недействителен (VC ошибочно) - то что такое const void?

4b9b3361

Ответ 1

const void - тип, с которым вы можете создать указатель. Он похож на обычный указатель void, но преобразования работают по-разному. Например, a 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

Ответ 2

As void, const void является типом void. Однако, если const void является возвращаемым типом, const не имеет смысла (хотя и законно!), Потому что [expr]/6:

Если prvalue изначально имеет тип "cv T", где T - это неквалифицированный не-класс, не-массив типа cv, тип выражение доводится до T до любого дальнейшего анализа.

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

Ответ 3

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

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