12 Classes [class]

12.3 Unions [class.union]

12.3.1 Anonymous unions [class.union.anon]

Союз формы

union { member-specification } ;

называется anonymous union; он определяет безымянный тип и безымянный объект этого типа, называемый anonymous union object. Каждый member-declarationв member-specification анонимном союзе должен либо определить нестатический элемент данных или быть static_assert-declaration. [ Note: Вложенные типы, анонимные объединения и функции не могут быть объявлены в анонимном объединении. ] Имена членов анонимного объединения должны отличаться от имен любых других объектов в области, в которой объявлено анонимное объединение. В целях поиска имени после определения анонимного объединения члены анонимного объединения считаются определенными в области, в которой объявлено анонимное объединение. [end noteExample:

void f() {
  union { int a; const char* p; };
  a = 1;
  p = "Jennifer";
}

Здесь a и p используются как обычные (не являющиеся членами) переменные, но поскольку они являются членами объединения, у них одинаковый адрес. ]end example

Анонимные объединения, объявленные в именованном пространстве имен или в глобальном пространстве имен, должны быть объявлены static. Анонимные объединения, объявленные в области видимости блока, должны быть объявлены с любым классом хранения, разрешенным для переменной области видимости блока, или без класса хранения. Класс хранения не допускается в объявлении анонимного объединения в области действия класса. Анонимный союз не может иметь членов или (пункт ). Анонимный союз не должен иметь функций-членов. private protected [class.access]

Объединение, для которого объявлены объекты, указатели или ссылки, не является анонимным объединением. [Example:

void f() {
  union { int aa; char* p; } obj, *ptr = &obj;
  aa = 1;           // error
  ptr->aa = 1;      // OK
}

Присвоение plain aa неверно сформировано, поскольку имя члена не видно за пределами объединения, и даже если оно было видимым, оно не связано с каким-либо конкретным объектом. ] [ Инициализация объединений без конструкторов, объявленных пользователем, описана в . ]end exampleNote: [dcl.init.aggr]end note

A union-like class - это объединение или класс, прямым членом которого является анонимный союз. Класс, подобный объединению, X имеет набор variant members. Если X это объединение, нестатический член данных, X который не является анонимным объединением, является его вариантным членом X. Кроме того, нестатический член данных анонимного союза, который является членом, X также является вариантным членом X. Не более одного варианта члена объединения может иметь инициализатор члена по умолчанию. [Example:

union U {
  int x = 0;
  union {
    int k;
  };
  union {
    int z;
    int y = 1;      // error: initialization for second variant member of U
  };
};

end example]