Какой смысл в const void? - PullRequest
       26

Какой смысл в const void?

59 голосов
/ 20 февраля 2011

Очевидно, можно объявить функцию, возвращающую const void:

const void foo()
{
}

g ++, похоже, считает const важным, поскольку следующий код не компилируется:

#include <type_traits>

static_assert(std::is_same<void(), const void()>::value, "const matters");

Так что const void имеет какое-либо практическое значение?

Ответы [ 2 ]

44 голосов
/ 20 февраля 2011

Не совсем.Но игнорирование cv -квалификаций для void или ошибка в них может создать ненужную сложность с точки зрения реализации компилятора и кода конечного пользователя.Рассмотрим такие шаблоны, как

  template<typename T>
  const T ...

Нет смысла делать использование void в этом сценарии особым случаем (больше, чем оно уже есть), это просто создает головные боли.

Кроме того, в то время как const void не полезно, const void* имеет свое применение.

11 голосов
/ 12 декабря 2013

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*.

...