Как отмечали другие, анонимные объединения разрешены в стандарте C ++, но анонимные структуры - нет.
Причина этого в том, что C поддерживает анонимные объединения, но не анонимные структуры *, поэтому C ++ поддерживает первое для совместимости, но не второе, потому что оно не требуется для совместимости.
Кроме того, анонимные структуры в C ++ не слишком полезны. Использование, которое вы демонстрируете, чтобы иметь структуру, содержащую три числа с плавающей точкой, на которые могут ссылаться либо .v[i]
, либо .x
, .y
и .z
, я считаю, приводит к неопределенному поведению в C ++. C ++ не позволяет вам писать одному члену объединения, скажем .v[1]
, а затем читать другому члену, скажем .y
. Хотя код, который делает это, не редкость, на самом деле он не очень хорошо определен.
Средства C ++ для пользовательских типов предоставляют альтернативные решения. Например:
struct vector3 {
float v[3];
float &operator[] (int i) { return v[i]; }
float &x() { return v[0]; }
float &y() { return v[1]; }
float &z() { return v[2]; }
};
* C11, очевидно, добавляет анонимные структуры, поэтому в будущем C ++ может добавить их.