Infetpret_cast между не связанными типами, разрешенными, если они являются стандартной планировкой в ​​C ++ 20C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Infetpret_cast между не связанными типами, разрешенными, если они являются стандартной планировкой в ​​C ++ 20

Сообщение Anonymous »

Уже было много вопросов о актерах, но, поскольку C ++ 20 есть несколько дополнительных конструкций, которые относятся к типам и, следовательно, этот вопрос. Рассмотрим следующую структуру класса. < /P>

Код: Выделить всё

struct A {
int index;
}

struct B: A {}

static_assert(std::is_standard_layout_v, "test");
static_assert(std::is_standard_layout_v, "test");
Оба типа являются стандартным layout , который мы можем проверить через static_assert. Для них в соответствии со стандартными следующими данными: < /p>

Два объекта A и B являются pointer-interconbentable if: < /p>

Один из них является стандартным объектом класса, а другой-первые нестатические данные, которые объектно-объект,
или, если объект не имеет non-static data of Data, есть элемент-элемент-элемент, который нет. (11.4), или < /li>
< /ul>
< /blockquote>
Это означает, что следующий код должен быть разрешен: < /p>

Код: Выделить всё

A a = {};
int* i = reinterpret_cast(&a);
B* b = reinterpret_cast(i);
Тем не менее, мой вопрос: если на самом деле разрешено использовать b для чего -либо. В частности, мне кажется, что правила псевдонизации типа запрещают доступ к получению (или написанию) lvalue b < /code> в соответствии с следующим оператором. Неопределенный.

Правила для типового доступного не совсем понятны для меня после прочтения описания, кажется, что динамический тип B -A., поскольку это относится к типичному алиасному правилам, поэтому следующий вопрос будет, если-то, если-fno-strict-alias позволит обратить это. Люди задаются вопросом о контексте. Это из устаревшей кодовой базы, где A имеет некоторые аксессуры, а B (и многие другие производные типы) - это по существу разные представления об этом базовом объекте, и иногда необходимо преобразовать между этими типами (и в фактической реализации это дорого). В то время, когда люди, с тех пор, как выравнивание и размер одинаковы, такие акции были бы надежными и дешевле, чем явные конструкции. Однако, в целом, это не является случаем. К сожалению, я не смог найти ни одного флага компилятора или дезинфицирующего средства, которое на самом деле показывает, что это UB или смог построить пример, где это идет не так.

Подробнее здесь: https://stackoverflow.com/questions/795 ... ard-layout
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Несогласованный вывод источников для протоколов со связанными типами
    Anonymous » » в форуме IOS
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Несогласованный вывод источников для протоколов со связанными типами
    Anonymous » » в форуме IOS
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • DeepLinks iOS не откроет мое приложение (как с типами URL, так и с связанными доменами)
    Anonymous » » в форуме IOS
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между типами проектов .NET Core и стандартной библиотеки классов .NET?
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между типами проектов .NET Core и стандартной библиотеки классов .NET?
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»