Строгие правила псевдонимов, нарушенные шаблонами и наследованием - PullRequest
0 голосов
/ 13 декабря 2018

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

struct Base {
  int field = 2;
};

template <typename T>
struct Specialization: public Base {
  void method() {
      Specialization copy;
      field = copy.field;
  }
};

int main() {
    Specialization<int> s;
    s.method();
}

предупреждение: разыменование указателя типа-наказанного будет> нарушать правила строгого псевдонима [-Wstrict-aliasing]field = copy.field;

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

struct Base {
  int field = 2;
};

struct Specialization: public Base {
  void method() {
      Specialization copy;
      field = copy.field;
  }
};

int main(){
    Specialization s;
    s.method();
}

Действительно ли я нарушаю строгие правила псевдонимов или GCC создаетложное срабатывание?

Я использую -Wstrict-aliasing=3 -O3 на GCC8

1 Ответ

0 голосов
/ 13 декабря 2018

Нет, в указанном коде нет строгих нарушений правил псевдонимов.Это похоже на ошибку в gcc.

Вы можете отправить отчет об ошибке в gcc (однако я не смог найти ничего там, связанного с предоставленным фрагментом), однако, судя по жизни и временам https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874 Я бы не ожидал немедленного исправления.

...