В чем смысл const void?
по-видимому, можно объявить функцию, возвращающую const void:
const void foo()
{
}
g++, кажется, рассматривает const важно, потому что следующий код не компилируется:
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
так же как и const void имеют ли они какое-либо практическое значение?
2 ответов:
не совсем так. Но игнорировать cv-квалификации на void или сделать их ошибки могут создать ненужную сложность с точки зрения реализации компилятора и кода конечного пользователя. Рассмотрим шаблоны, такие как
template<typename T> const T ...нет причин делать использование void в этом сценарии особым случаем (больше, чем это уже есть), это просто создаст головные боли.
кроме того, в то время как
const voidне полезны,const void*имеет свое применение.
const voidразрешено просто потому, что нет смысла заставлять компилятор выбивать это одно исключение из общего правила, и это не вредит оставить его.есть некоторые обсуждения выше этого
const void*не очень полезно:насколько полезен const void *? Я вижу, как может быть пустота * const, но не первая. - Паук
в самом деле
const void*иногда имеет важное значение. Он заявляет, что вещь, на которую указывают, читается только в отличие отvoid* constкоторый только объявляет, что сам указатель является постоянным, но не то, на что он указывает.по моему опыту, указатель на константу с помощью
const void*является более полезным из двух форм. Конечно, есть иconst void* constэто означает, что и указатель, и то, на что он указывает, являются постоянными.
void*обычно используется как способ передачи неспецифических указателей вокруг (например, сmemcpy()). Если вы хотите передатьconst char*такой функции тогда вы не можете использоватьvoid*или вы теряете тот факт, что вещь, на которую он указывает, постоянна и не может быть изменена. Текущие компиляторы C++ откажутся компилировать это, поскольку это должно было бы неявно привести кconstпрочь, и по праву, так как эти данные могут быть в памяти только для чтения и, возможно, вызвать исключение, если что-нибудь попытается записать в него.вот почему второй аргумент
memcpy()иconst void*а не простоvoid*.
Comments