Могу ли я по закону повторно интерпретировать_cast между совместимыми с макетом типами стандартных макетов?

Я пишу класс, который, принимая ответ на Совместимо ли расположение типов перечисления с их базовым типом? «да», совместим с макетом struct kevent но использует enum classдля filter, flagsи т. д. с соответствующими базовыми типами для соответствующих полей. Это также стандартная схема (все поля private и все сами по себе стандартной компоновки нет virtual членов, нет базовых классов). Из моего прочтения n3690Я могу определить, что мой класс и struct kevent имеют одинаковое представление значений, но я не вижу ничего в стандарте, что позволяет мне reinterpret_cast между ними, даже если это кажется разумным толкованием «представления стоимости». Это технически разрешено стандартом? Если нет, то что дает знание представления значения типа?

РЕДАКТИРОВАТЬ 2014/02/24 16:45 EST: В ответ на комментарий я должен уточнить, что я хочу reinterpret_cast первый класс ссылка на во-вторых, как, конечно, вы не можете напрямую reinterpret_cast тип без указателя на другой тип без указателя.

7

Решение

но я не вижу ничего в стандарте, что позволяет мне reinterpret_cast между ними, даже если это кажется разумным толкованием «представления стоимости». Это технически разрешено стандартом?

Нет. Стандарт ясен (см. [Basic.lval] p10) о том, какие типы могут быть псевдонимами, и совместимые с макетом типы не включены.

Если нет, то что дает знание представления значения типа?

Если оба типа являются тривиально копируемыми и имеют одно и то же представление значений, вы можете записать memcpy из объекта одного типа в объект другого типа, и наоборот. Если их нетривиально копировать, то это совсем не даст вам ничего.

AFAICT Стандарт на самом деле не говорит, что можно и нельзя делать с типами, совместимыми с макетом.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]