Некоторые компиляторы C++ разрешают анонимные объединения и структуры как расширение стандартного C++. Это - немного синтаксического сахара, это иногда очень полезно.
Каково объяснение, которое препятствует тому, чтобы это было частью стандарта? Существует ли технический контрольно-пропускной пункт? Философский? Или просто недостаточно потребности выровнять по ширине его?
Вот образец того, о чем я говорю:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
Мой компилятор примет это, но он предупреждает, что "неназванная структура/объединение" является нестандартным расширением C++.
Союзы могут быть анонимными; см. Стандарт, 9.5, параграф 2.
Какую цель вы считаете выполняемой анонимной структурой или классом? Прежде чем размышлять, почему чего-то нет в Стандарте, я хотел бы иметь некоторое представление, почему это должно быть, и я не вижу использования анонимной структуры.
Не уверен, что вы имеете в виду. Раздел 9.5 спецификации C++, пункт 2:
Объединение вида
union { member-specification } ;
называется анонимным объединением; оно определяет неназванный объект неназванного типа.
Вы можете делать и такие вещи:
void foo()
{
typedef
struct { // unnamed, is that what you mean by anonymous?
int a;
char b;
} MyStructType; // this is more of a "C" style, but valid C++ nonetheless
struct { // an anonymous struct, not even typedef'd
double x;
double y;
} point = { 1.0, 3.4 };
}
Не всегда очень полезно... хотя иногда полезно в неприятных макроопределениях.
На основе правка, комментарии и эта статья MSDN: Анонимные структуры , рискну предположить - это плохо согласуется с концепцией инкапсуляции. Я бы не ожидал, что член класса будет возиться с пространством имен моего класса, кроме простого добавления одного члена. Более того, изменения анонимной структуры могут повлиять на мой класс без разрешения.
Ваш код
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
похож на
union Foo {
int;
float v[3];
};
который, безусловно, недействителен (в C99 и ранее).
Причина в возможно упрощении разбора (в C), потому что в этом случае вам нужно только проверить, что тело struct/union содержит только "деклараторные утверждения", как
Type field;
Тем не менее, gcc и "другие компиляторы" поддерживают неименованные поля в качестве расширения.
Редактировать: Анонимные структуры теперь официально поддерживаются в C11 (§6.7.2.1/13).