Имеет ли доступ к объединениям битовых полей общее поведение неопределенных исходных данных в стандартах C ++ - PullRequest
1 голос
/ 11 октября 2019

Аналогично c объединением и битовыми полями , но в C++, включая доступ к начальной последовательности

Аналогично Объединение общей начальной последовательности с примитивом , но с использованием bitfields

Что я хочу сделать, это:

struct A
{
   short common : 1;
   short a1: 5;
   short a2: 8;
};

struct B
{
   short common : 1;
   short b1: 3;
   short b2: 4;
   short b3: 6;
};

union C
{
    A a;
    B b;
};

Затем используйте его следующим образом:

short foo(C data)
{
   if (data.a.common)
   {
       return data.a.a1*data.a.a2;
   }
   return data.b.b1*data.b.b2*data.b.b3;
}

Кажется, проблема в том, что если data.a.commonfalse, код получит доступ к данным, установленным как B через член A

В стандарте, кажется, есть язык об объединениях и аналогичных исходных последовательностях, но не уверен, что common какbitfield будет считать

9.5.1, разрешено проверять общую начальную последовательность любого из элементов структуры стандартного макета;

Любые разъяснения приветствуются

1 Ответ

1 голос
/ 11 октября 2019

По определению общей начальной последовательности :

Общая начальная последовательность двух типов структуры стандартной структуры ([class.prop]) является самой длинной последовательностью-статические члены данных и битовые поля в порядке объявления, начиная с первого такого объекта в каждой из структур, так что соответствующие объекты имеют типы, совместимые с компоновкой, либо оба объекта объявляются с атрибутом no_unique_address ([dcl.attr.nouniqueaddr]) или нет, и оба объекта являются битовыми полями с одинаковой шириной, или ни одно из них не является битовым полем.

общая начальная последовательность struct A и struct B состоит изпервое битовое поле common.

...