严格的别名规则被模板和继承所破坏

时间:2018-12-13 15:44:33

标签: c++ templates inheritance gcc strict-aliasing

以下代码在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

1 个答案:

答案 0 :(得分:4)

不,在提供的代码中没有严格的违反别名规则的情况。看起来像是gcc中的错误。

您可以向gcc提交错误报告(我现在找不到与提供的代码段相关的任何内容),但是,根据https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874的寿命和时间来看,我不希望立即修复。