小编S. *_*zor的帖子

严格的别名规则打破了模板和继承

以下代码在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();
}
Run Code Online (Sandbox Code Playgroud)

警告:解除引用类型惩罚指针将>破坏严格别名规则[-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();
}
Run Code Online (Sandbox Code Playgroud)

我真的打破严格的别名规则还是GCC产生假阳性?

-Wstrict-aliasing=3 -O3在GCC8上使用

c++ inheritance gcc templates strict-aliasing

8
推荐指数
1
解决办法
165
查看次数

标签 统计

c++ ×1

gcc ×1

inheritance ×1

strict-aliasing ×1

templates ×1