Ошибка: оператор присвоения копии не разрешен в объединении - PullRequest
5 голосов
/ 29 октября 2010

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

typedef union  {
   struct {
     const  int j;
   } tag;
} X;


int main(){
    return 0;
}
error: member `<`anonymous union>::`<`anonymous struct> `<`anonymous union>::tag with copy assignment operator not allowed in union

Этот код компилирует штрафы с помощью gcc. Выдает ошибку только с g ++.

Ответы [ 2 ]

6 голосов
/ 29 октября 2010

Чтобы иметь член объединения некоторого типа класса T, специальные функции-члены T (конструктор по умолчанию, конструктор копирования, оператор копирования и деструктор) должны быть тривиальными. То есть они должны быть теми, которые неявно объявлены и определены компилятором.

Ваша безымянная структура не имеет тривиального оператора присваивания копии (на самом деле, он вообще не имеет оператора присваивания), потому что имеет переменную-член, которая const -квалифицирована, что подавляет генерацию неявно объявленного присвоения копии оператор.

2 голосов
/ 29 октября 2010

Компилятор пытается сгенерировать оператор присваивания для самого union и завершается неудачно, поскольку активное поле union, если оно неизвестно, поэтому возвращается к битовой копии объекта.Тем не менее, он также не может этого сделать, так как struct { const int j; } имеет нетривиальный оператор присваивания.

См. http://gcc.gnu.org/ml/gcc-help/2008-03/msg00051.html.

...