Как void работает с псевдонимом типа?

Я внимательно прочитал правила для псевдонима типов: http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing У меня конкретно есть вопрос о последнем правиле, в котором нам разрешено приводить к:

char или unsigned char: это позволяет исследовать объектное представление любого объекта в виде массива unsigned char

Я заметил, что это не включает тип void. Разве мы не можем что-либо переводить на void и обратно?


person Jonathan Mee    schedule 16.08.2016    source источник
comment
Вы можете транслировать в void* и обратно.   -  person NathanOliver    schedule 16.08.2016
comment
Приведение указателя к несвязанному типу не запрещено. Разыменовывание результата и использование значения.   -  person n. 1.8e9-where's-my-share m.    schedule 16.08.2016
comment
Прошу прощения, если мой ответ звучит снисходительно. У вас явно больше знаний о C ++, чем у меня, но я хочу быть уверенным, что ответ будет понятен всем, кто его читает, поэтому я немного прибавил.   -  person PC Luddite    schedule 16.08.2016
comment
Псевдоним не связан с тем, что вы передаете и от чего. Речь идет об исследовании представления объекта. То есть разыменование указателя.   -  person Nicol Bolas    schedule 16.08.2016


Ответы (3)


В этом случае нет псевдонима типов, потому что вы не можете исследовать объект через void*. Для этого вам придется разыменовать void*, но это запрещено. void в любом контексте является неполным типом, и вы не можете разыменовать указатели на неполные типы.

person MSalters    schedule 16.08.2016

void - неполный тип. Не может быть объекта типа void.

person Igor Tandetnik    schedule 16.08.2016
comment
Он не только неполный, но и никогда не может быть завершен. Это не похоже на, скажем, int[], который определенно может быть типом glvalue (но не prvalue). - person Kerrek SB; 16.08.2016

void странно тем, что вы можете объявить что-то void*, но вы редко будете использовать void отдельно вне контекста определения функции. В этом смысле это неполный тип и, следовательно, сам по себе не имеет реального значения. void действительно существует только для синтаксиса.

Технически вы можете привести тип к void,

int i = 0;
(void)i;

но это действительно запрет. Вы можете увидеть это, когда кто-то пытается скрыть предупреждения компилятора о неиспользуемых переменных. Вы не можете вернуть результат к исходному типу, потому что он не дает результата.

Вы также можете приводить указатели и объявлять их как void*, что означает, что он может указывать на что угодно (с некоторыми исключениями). Однако вы не можете разыменовать его, пока не приведете его к полному типу, например unsigned char.

person PC Luddite    schedule 16.08.2016