§9.5 / 9 из стандарта C ++ 11 (выделено мной):
подобный объединению класс - это объединение или класс, прямым членом которого является анонимное объединение. Подобный объединению класс
X
имеет набор вариантов членов . ЕслиX
являетсяunion
, нестатический член данныхX
, который не является анонимным объединением, является вариантным членомX
.
Часть, выделенная жирным шрифтом, говорит, что между классом, подобным объединению, который является либо классом, либо объединением, только если это объединение, может ли он иметь нестатический вариантный член, который не является анонимным объединением? Если это так, то почему? И какая практическая разница в коде?
Я действительно сомневаюсь, означает ли это утверждение, что «Если X
является классом, подобным объединению ...». Тогда это будет иметь для меня полный смысл.
В любом случае, этот пункт беспокоит меня последние несколько дней, и я хочу полностью понять, что в нем говорится.
3 ответа
Нет, ваша попытка разъяснения неверна. Вот подобный объединению класс X:
struct X
{
int a;
union {
double b;
long c;
};
};
X::a
- это нестатический член данных объединенного класса X
, который не является анонимным объединением. Но это определенно НЕ вариантный член.
Все нестатические элементы данных объединения являются вариантными членами. Для классов, подобных объединению, которые не являются объединениями, только те, которые вложены в подобъекты объединения, являются вариантными членами.
Я чувствую вашу боль, требуется много лет когнитивного ущерба, вызванного просмотром документов стандартов, чтобы правильно разбирать такие вещи.
только если это объединение, может ли он иметь нестатический вариантный член, не являющийся анонимным объединением?
Не совсем.
Это не означает, что только объединенная версия объединенного класса может иметь нестатический бла-бла-бла.
Он говорит, что оба могут иметь это (технически это не говорит , но он отказывается опровергать такую возможность), но только в версии union это будет рассматриваться как "a вариант члена X ".
Похоже на последний общедоступный черновик ( 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
как непосредственный член), чтобы быть классом, подобным объединению .
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
VARIANT
в Windows). Текст, выделенный полужирным шрифтом, определяет вариантный элемент для случая, когдаX
является объединением. Следующее предложение (которое вы не указали) определяет вариантный элемент для случая, когдаX
не является объединением, и для случая анонимных объединений, которые являются членамиX
.