Это своего рода базовый, но я не могу поверить в это. Артикул hereуказатель на void
Есть void *p
и const void *p
достаточно разные? Зачем использовать функцию const void *
вместо void *
?
Это своего рода базовый, но я не могу поверить в это. Артикул hereуказатель на void
Есть void *p
и const void *p
достаточно разные? Зачем использовать функцию const void *
вместо void *
?
Причина использования void*
вообще (независимо от того, является ли она const
или нет). Это как базовый класс: все указатели - этоvoid*
и могут неявно вставлять в него, но отличные от void*
набранные указатели должны выполняться явно и вручную.
Как правило, у C++ есть лучшие способы сделать это (а именно OO и шаблоны), поэтому не имеет смысла использовать void*
вообще, за исключением случаев, когда вы взаимодействуете с C. Однако, если вы используете его , то const
предлагает только то, что он предлагает в другом месте: вам нужно (дополнительно) const_cast
, чтобы иметь возможность изменить объект, на который ссылается, поэтому вы вряд ли сможете его случайно изменить.
Конечно, это зависит от того, что вы не используете C-style casts, но явные C++-ролики. Литой от void*
к любому T*
требуется static_cast
, и это не позволяет удалить const
. Таким образом, вы можете отливать const void*
до const char*
, используя static_cast
, но не до char*
. Это потребует дополнительного const_cast
.
Хороший ответ, но я думаю, что это не то, о чем просили. Это разница между версией const и non const. –
Я считаю, что от 'void *' до 'T *' требуется 'static_cast'. 'reinterpret_cast' всегда реализуется, и его следует избегать. –
Я думаю, что ОП знает значение 'const', он просто говорит, что он не понимает, что именно сделать из' const void'. Поэтому я думаю, что это хороший ответ. И хорошее использование 'reinterpret_cast', между прочим. – Gorpik
Простая разница. Как было указано, нет необходимости использовать void*
в C++ из-за его лучшей системы типов, шаблонов и т. Д. Однако при взаимодействии с C или системными вызовами вам иногда нужен способ указать значение без известного типа.
Как вы спрашиваете, разница между void*
и const void*
намеком, чтобы показать вам, если содержимое заостренной памяти будет изменено в функции вы звоните, то const
означает, что он будет иметь доступ только для чтения.
В C++ константа перед указателем говорит, что данные по адресу указателя не должны быть изменены. то есть он останавливает кто-то это делает:
int v1 = 3;
int v2 = 4;
const int *pv = &v1;
pv = &v2 // ok;
*pv = 5; // error
Вы также можете сделать сам константное значение указателя:
int v1 = 3;
int v2 = 4;
int * const pv = &v1;
*pv = 5; // ok
pv = &v2; // error
Вы можете также объединить два:
int v1 = 3;
int v2 = 4;
const int * const pv = &v1;
*pv = 5; // error
pv = &v2; // error
существенно отличается для чего? –
Я имею в виду, что имеет смысл иметь что-то как «const void»? – Chubsdad
Да, это указатель на неизменный объект неизвестного типа. –