在各种 3d 数学代码库中,我有时会遇到这样的情况:
struct vec {
float x, y, z;
float& operator[](std::size_t i)
{
assert(i < 3);
return (&x)[i];
}
};
其中,AFAIK 是非法的,因为允许实现在成员之间虚假地添加填充,即使它们属于同一类型,但实际上没有人会这样做。
通过static_assert
s 施加约束可以使其合法化吗?
static_assert(sizeof(vec) == sizeof(float) * 3);
即static_assert
没有被触发意味着operator[]
什么是预期的并且在运行时不调用UB?