Что такое 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
?
Ответы
Ответ 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
может быть бессмысленным, но он действительный код.