const void
допускается просто потому, что нет смысла заставлять компилятор исключать это единственное исключение из общего правила, и не вредно оставлять его в.
Выше обсуждается, что const void*
не очень полезно:
Насколько полезен const void *? Я вижу, насколько void * const может быть, но не первый. -Spidey
На самом деле const void*
иногда необходим.
Он объявляет, что указанная вещь предназначена только для чтения, в отличие от void* const
, которая только объявляет, что сам указатель является константой, но не вещь, на которую он указывает.
Из моего опыта, указатель на константу, использующий const void*
, является более полезным из двух форм. Конечно, есть также const void* const
, означающий, что и указатель, и объект, на который он указывает, являются постоянными.
void*
обычно используется как способ передачи неспецифических указателей (например, с memcpy()
).
Если вы хотите передать const char*
такой функции, то вы не можете использовать void*
, или вы потеряете тот факт, что объект, на который он указывает, является постоянным и не может быть изменен. Текущие компиляторы C ++ откажутся скомпилировать это, поскольку это должно было бы неявно откинуть const
, и это справедливо, так как эти данные могут быть в постоянной памяти и могут вызвать исключение, если что-то попытается записать в него.
Вот почему второй аргумент memcpy()
это const void*
, а не просто void*
.