Peter написал:
Пусть void* и конкретный тип, но по определению это неопределеённый тип,
это всё синтаксическая шелуха. Обычно void* это вполне определённый тип, и его следует понимать как например слово "человек". Понятно, что у этого человека есть имя, фамилия, и прочее. Может это даже женщина. И всё равно, мы используем для его наименования слово "человек". Однако, если void* это параметр нераскрываемой функции, то тогда он становится истинным указателем на НЁХ. В этом случае его даже не стоит и пытаться разименовать - программа рухнет как карточный домик в самый ответственный момент! Но пока это не истинный void*, а лишь псевдоним, мы можем его даже и разименовывать (помня о том, что так вообще-то делать нельзя, однако, если ваша программа таки собралась и работает, то этот бинарник скорее всего тоже будет работоспособен. Правда только в протестированной платформе). Проблема в том, что разименование void* не даёт никакой выгоды, если делать всё по правилам, вы напишете на 3 буквы больше, но это всё тоже будет выкинуто компилятором. И кроме того, вы избавитесь от возможных проблем в будущем.
Вообще, когда вы пишите на C/C++, не стоит боятся длинных и понятных конструкций - помните, компилятор выбросит весь ненужный мусор, и не надо делать это за него. Если уж так неймётся - сделайте ассемблерную вставку, а не надейтесь на UB.
Peter написал:
Вот как компилятор будет организовывать работу с указателем, относительно которго он
не знает, на что он указывает, то я не знаю, есть ли тут какие-то стандарты
стандарт прост - UB. Единственное, что вы можете сделать с истинным указателем void* - это его скопировать в другой void* (ну ещё взять его адрес, получив void**).
Peter написал:
Он вправе счесть его указателм на константу, что я и наблюдал в Ubuntu при -O3
он ещё вправе нарисовать розового слоника, и отправить почтового голубя.