Я тестировал следующий код с GCC 4.8, который не компилируется, потому что мы не можем создать ссылку на void.
#include <iterator>
int main()
{
std::iterator_traits<void*> test;
}
Означает ли это, что void * не является iterator? (что означает понятие здесь)
EDIT:
Хорошо, что вопрос был плохо сформирован. Я действительно спрашиваю, почему С++ нуждается в таком поведении для void *? Это касается проблем безопасности, то есть не позволяет людям писать плохие вещи?
Поскольку в то время как отсрочка void является незаконной, арифметика указателя такова:
int main()
{
std::uint8_t test[] = {1,2,3};
void * wut = test;
std::uint8_t * p2 = static_cast<std::uint8_t *>(wut + 1);
std::cout << std::hex << static_cast<int>(*p2) << std::endl;
}
Итак, даже если, как вы сказали, void не имеет размера, с точки зрения GCC, это так. И это размер наименьшей адресной единицы в компьютере.