В чем смысл 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 имеют ли они какое-либо практическое значение?

798   2  

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

    Ничего не найдено.