这是否违反严格的别名规则?

and*_*ean 12 c++ strict-aliasing language-lawyer

根据标准- 聚合或联合类型,在其元素或非静态数据成员(包括递归地,子聚合或包含的联合的元素或非静态数据成员)中包括上述类型之一,这是允许的:

struct foo {
  float x;
};

void bar(foo*);

float values[9];
bar(reinterpret_cast<foo*>(&values));
Run Code Online (Sandbox Code Playgroud)

但是,我不确定以下示例是否也遵循此规则:

struct foo {
  float x;
  float y;
  float z;
};

void bar(foo*);

float values[9];
assert((sizeof(values) / sizeof(float)) % 3 == 0);  // sanity check
bar(reinterpret_cast<foo*>(&values));
Run Code Online (Sandbox Code Playgroud)