Я пишу класс, который, принимая ответ на Совместимо ли расположение типов перечисления с их базовым типом? «да», совместим с макетом struct kevent
но использует enum class
для filter
, flags
и т. д. с соответствующими базовыми типами для соответствующих полей. Это также стандартная схема (все поля private
и все сами по себе стандартной компоновки нет virtual
членов, нет базовых классов). Из моего прочтения n3690
Я могу определить, что мой класс и struct kevent
имеют одинаковое представление значений, но я не вижу ничего в стандарте, что позволяет мне reinterpret_cast
между ними, даже если это кажется разумным толкованием «представления стоимости». Это технически разрешено стандартом? Если нет, то что дает знание представления значения типа?
РЕДАКТИРОВАТЬ 2014/02/24 16:45 EST: В ответ на комментарий я должен уточнить, что я хочу reinterpret_cast
первый класс ссылка на во-вторых, как, конечно, вы не можете напрямую reinterpret_cast
тип без указателя на другой тип без указателя.
но я не вижу ничего в стандарте, что позволяет мне
reinterpret_cast
между ними, даже если это кажется разумным толкованием «представления стоимости». Это технически разрешено стандартом?
Нет. Стандарт ясен (см. [Basic.lval] p10) о том, какие типы могут быть псевдонимами, и совместимые с макетом типы не включены.
Если нет, то что дает знание представления значения типа?
Если оба типа являются тривиально копируемыми и имеют одно и то же представление значений, вы можете записать memcpy из объекта одного типа в объект другого типа, и наоборот. Если их нетривиально копировать, то это совсем не даст вам ничего.
AFAICT Стандарт на самом деле не говорит, что можно и нельзя делать с типами, совместимыми с макетом.
Других решений пока нет …