точка зрения из документа ISO: на основе анонимных союзов - PullRequest
3 голосов
/ 22 июня 2011

Точка из стандарта ISO C ++: раздел 9.5, пункт 4, строка 1:

      "A union for which objects or pointers are declared is not
       an anonymous union."

Пример:

 struct X {
        union {
               int i;
               double d;
             } ;
        int f () { return i;}      
       };
   int main() { return 0; }

IAm ожидает ошибку из этого примера в соответствии с вышеуказанным пунктом

но GCC, компилятор SUN CC, EDG и т. Д. Не показывают ошибку

iam ожидает эту ошибку // error: не может получить прямой доступ к «i»

пожалуйста .. подтвердите приведенный выше пример, программа верна, неверна

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Это сделало бы объединение не анонимным:

struct X {
    union {
        int i;
        double d;
    } *p;
    int f () { return i;}      // !Nyet.
};

Приветствия и hth.,

3 голосов
/ 22 июня 2011

Чтобы добавить к тому, что говорит Альф, цель анонимного языка объединения в спецификации C ++ состоит в том, чтобы разрешить определение членов объединения. Если у вас есть именованный союз внутри структуры:

struct X {
    union {
        int i;
        double d;
    } varname;
};

i не является членом структуры X. i является членом varname, который сам является членом структуры X.

Однако, если объединение не имеет объявленной переменной-члена, тогда к i нужно будет обращаться напрямую как к члену X. Это может работать только в том случае, если объединение не имеет имени (переменные не объявляются с определением объединения). Такие союзы называются «анонимные союзы».

...