假设我们的结构包含4个float
值和一个包含4个元素的float
数组。
然后是未定义的行为是否以Foo
实例的形式访问数组并通过该实例更改数组元素?
struct Foo
{
float a;
float b;
float c;
float d;
};
float values[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
int main()
{
auto& floats = *reinterpret_cast<Foo*>(values);
floats.a = 0.0f;
floats.b = 0.0f;
floats.c = 0.0f;
floats.d = 0.0f;
}
编译并在线运行:http://cpp.sh/6y7m
答案 0 :(得分:4)
是的,确实是一种未定义的行为。它违反了所谓的严格别名规则 - 它禁止通过无关指针访问对象(我不会在这里详细介绍无关的细节,除非特别说明问)。
但是,结构的浮点数组是不相关的。
以下是标准(3.10 / 10)的摘录:
如果程序试图通过访问对象的存储值 行为是除以下类型之一以外的glvalue 未定义:
- 对象的动态类型,
- 对象的动态类型的cv限定版本,
- 类似的类型(如 4.4)中定义的对象的动态类型,
- 一种类型 对应于动态类型的有符号或无符号类型 对象,
- 对应的有符号或无符号类型的类型 对象的动态类型的cv限定版本,
- 包含上述类型之一的聚合或联合类型 其元素或非静态数据成员(包括,递归地, 子聚合或包含的元素或非静态数据成员 联合),
- 一种类型(可能是cv限定的)基类类型 对象的动态类型,
- char或unsigned char类型。