Результатом приведения типа не является lvalue, поэтому его нельзя присваивать, а (встроенный) ++ является формой присваивания.Это была ошибка в компиляторе, если он когда-либо работал.
Со ссылкой он компилируется (в действительности это то же самое, что и *(T**)&p
), но из-за правил наложения имен (компилятор может предполагать, что указатели (и ссылки)разные типы не указывают на один и тот же объект) формально он недействителен, хотя он будет работать на всех известных компиляторах.
Самый простой способ:
p = static_cast<void *>(static_cast<T *>(p) + 1)
(никогда не используйте Cв стиле C ++) и полагаться на то, что компилятор сможет скомпилировать его точно так же, как ++
.Однако, если у вас есть аргумент шаблона, доступный при определении указателя (в примере кода, который вы делаете), гораздо лучше просто использовать правильно типизированный указатель (я бы сказал, он также будет работать с указателями на члены, но они не имеют значимого значения).++
).