Следующий код дает мне предупреждение в 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