Здравствуйте, Caracrist, Вы писали:
C>здесь
C>C> class Widget { // Three alternative implementations represented as a union
C> private:
C> enum class Tag { point, number, text } type; // discriminant
C> union { // representation
C> point p; // point has constructor
C> int i;
C> string s; // string has default constructor, copy operations, and destructor
C> };
C> // ...
C> widget& operator=(const widget& w) // necessary because of the string variant
C> {
C> if (type==Tag::text && w.type==Tag::text) {
C> s = w.s; // usual string assignment
C> return *this;
C> }
C> if (type==Tag::text) s.~string(); // destroy (explicitly!)
C> switch (type==w.type) {
C> case Tag::point: p = w.p; break; // normal copy
C> case Tag::number: i = w.i; break;
C> case Tag::text: new(&s)(w.s); break; // placement new
C> }
C> type = w.type;
C> return *this;
C> }
C> };
C>
C>Я выделил не понятные мне места.
C>point p; — это какого типа переменная? с моей точки зрения это равнозначно написанию:
C>42 р;
C>new(&s)(w.s); — такое в операторе присваивания, это бесплатное пособие по UB
А меня смущает enum class Tag.
Что это означает? Раньше такого не встречал...