严格混叠规则是否适用于函数调用?

wan*_*wan 0 c++ strict-aliasing language-lawyer

关于下面的示例,在中f1,不会发生别名,因为pvoid*)无法访问,并且p1是访问内存的唯一指针。但是,p1float*)和p2int*)之间的指针别名在outside之外f1
我的问题是,此别名是否合法,也就是说,严格混叠规则是否适用于函数调用?

如果此示例有效,那么如果f1内联了该怎么办?

void f1(void *p)
{
  auto* p1 = static_cast<float*>(p);
  *p1 = 1.f;
}

int f2()
{
  int x = 1;
  auto* p2 = &x;
  f1(&x);
  *p2 = 1;
  return *p2;
}
Run Code Online (Sandbox Code Playgroud)

mol*_*ilo 7

复制指针或将指针传递到其他位置的次数或转换指针的次数无关紧要,决定因素始终是该位置实际存储的内容。

在您的情况下,唯一重要的是static_cast的参数是否实际上是a的地址float,而实际上不是。

  • 更精确地说,唯一重要的是`* p1'是否实际引用了float类型的对象。它不是,因此UB。这只是为了说明问题不是“ static_cast”本身,而是通过[错误类型]的左值对对象存储值的访问(http://eel.is/c++draft/basic.lval #11)... (3认同)