以下代码在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] 字段= 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产生了误报?
我在GCC8上使用-Wstrict-aliasing=3 -O3
答案 0 :(得分:4)
不,在提供的代码中没有严格的违反别名规则的情况。看起来像是gcc中的错误。
您可以向gcc提交错误报告(我现在找不到与提供的代码段相关的任何内容),但是,根据https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874的寿命和时间来看,我不希望立即修复。