Какие неограниченные союзы предлагаются в C ++ 11? - PullRequest
16 голосов
/ 05 апреля 2011

Я считаю unrestricted unions одной из функциональных возможностей, представленных в C ++ 11.Может ли кто-нибудь объяснить семантику и преимущества, которые она дает?

Ответы [ 3 ]

22 голосов
/ 05 апреля 2011

В википедии есть объяснение: http://en.wikipedia.org/wiki/C%2B%2B0x#Unrestricted_unions

Сначала поищите там, прежде чем спрашивать о возможностях C ++ 0x.

Неограниченные союзы

В стандарте C ++ Есть ограничения на какие типы объектов могут быть членами союза. Например, союзы не могут содержать объекты, которые определяют нетривиальные конструктор. C ++ 0x облегчит некоторые из этих ограничений, позволяющих профсоюзам для использования на большем количестве типов, которые они ранее не разрешалось использовать на. [6] Это простой пример объединение разрешено в C ++ 0x:

//for placement new
#include <new>

struct Point  {
    Point() {}
    Point(int x, int y): x_(x), y_(y) {}
    int x_, y_;
};
union U {
    int z;
    double w;
    Point p;  // Illegal in C++; point has a non-trivial constructor. 
              //   However, this is legal in C++0x.
    U() { new( &p ) Point(); } // No nontrivial member functions are
                               //implicitly defined for a union;
                               // if required they are instead deleted
                               // to force a manual definition.
};

Изменения не нарушат существующий код, так как они только расслабляются текущие правила.

8 голосов
/ 05 апреля 2011

Это не что иное, как старые у нас союзы, объект, содержащий по одному члену за раз, различного типа.

Изменение состоит в том, что теперь вы можете хранить типы не POD в объединении. Тем не менее, вы будете нести ответственность за явное создание и уничтожение этого члена.

Из N3242:

[Пример: рассмотрим объект u типа U, имеющий нестатические данные члены m типа M и n типа N. Если M имеет нетривиальный деструктор, а N имеет нетривиальный конструктор (например, если они объявляют или наследуют виртуальные функции), активный член u может быть безопасно переключен от m до n, используя деструктор и оператор размещения new следующим образом:
u.m. ~ М ();
новый (& u.n) N;
- конец примера]

Не очень полезная функция, ИМО.

1 голос
/ 04 июня 2016

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

Цена, которую вы платите за это, заключается в том, что вы должны вести осторожный бухгалтерский учет. С простым старым назначением объединения данных было достаточно изменить «текущий тип», и чтение неправильного типа могло привести к искаженным данным, но не намного больше. При непростом удалении старых данных вы должны следить за текущим типом и вызывать конструкторы и деструкторы corect вручную, чтобы изменить текущий тип и правильно очистить объекты при уничтожении объединения в целом. Если вы попытаетесь прочитать или написать тип wring, вероятно, произойдут плохие вещи

...