§9.5 / 9 из стандарта C ++ 11 (выделено мной):

подобный объединению класс - это объединение или класс, прямым членом которого является анонимное объединение. Подобный объединению класс X имеет набор вариантов членов . Если X является union, нестатический член данных X, который не является анонимным объединением, является вариантным членом X.

Часть, выделенная жирным шрифтом, говорит, что между классом, подобным объединению, который является либо классом, либо объединением, только если это объединение, может ли он иметь нестатический вариантный член, который не является анонимным объединением? Если это так, то почему? И какая практическая разница в коде?

Я действительно сомневаюсь, означает ли это утверждение, что «Если X является классом, подобным объединению ...». Тогда это будет иметь для меня полный смысл.

В любом случае, этот пункт беспокоит меня последние несколько дней, и я хочу полностью понять, что в нем говорится.

5
David G 11 Сен 2014 в 06:25
1
Терминология «вариантный элемент» связана с концепцией «варианта» (например, VARIANT в Windows). Текст, выделенный полужирным шрифтом, определяет вариантный элемент для случая, когда X является объединением. Следующее предложение (которое вы не указали) определяет вариантный элемент для случая, когда X не является объединением, и для случая анонимных объединений, которые являются членами X.
 – 
M.M
11 Сен 2014 в 06:31

3 ответа

Лучший ответ

Нет, ваша попытка разъяснения неверна. Вот подобный объединению класс X:

struct X
{
    int a;
    union {
        double b;
        long c;
    };
};

X::a - это нестатический член данных объединенного класса X, который не является анонимным объединением. Но это определенно НЕ вариантный член.

Все нестатические элементы данных объединения являются вариантными членами. Для классов, подобных объединению, которые не являются объединениями, только те, которые вложены в подобъекты объединения, являются вариантными членами.

5
Ben Voigt 11 Сен 2014 в 06:43

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

только если это объединение, может ли он иметь нестатический вариантный член, не являющийся анонимным объединением?

Не совсем.

Это не означает, что только объединенная версия объединенного класса может иметь нестатический бла-бла-бла.

Он говорит, что оба могут иметь это (технически это не говорит , но он отказывается опровергать такую ​​возможность), но только в версии union это будет рассматриваться как "a вариант члена X ".

2
paxdiablo 11 Сен 2014 в 06:32

Похоже на последний общедоступный черновик ( 2013-10-13) имеют более точное определение, цитата:

подобный объединению класс - это объединение или класс, имеющий анонимное объединение. как непосредственный участник. Подобный объединению класс X имеет набор вариантов участники . Если X является объединением, нестатический член данных X, который не анонимный союз - вариантный член X. Кроме того, нестатический член данных анонимного объединения, который является членом X также является вариантным членом X. Максимум один вариант члена союза может иметь инициализатор скобки или равенства . Пример:

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

Что касается вопроса, выделенная полужирным шрифтом часть фактически определяет, что такое вариантный член , который должен иметь объединяющий класс (имея union как непосредственный член), чтобы быть классом, подобным объединению .

0
Petr Abdulin 11 Сен 2014 в 06:57
Хм, это не текущий проект. Ваша формулировка на самом деле старше, чем в вопросе (что может быть не из официальной формулировки С++ 11, как она утверждает).
 – 
Ben Voigt
11 Сен 2014 в 06:40