将包含 POD 的包装器结构数组转换为它包含的 POD 类型数组是否合法?
Is it legal to cast array of wrapper structs containing POD to the array of POD type it contains?
此 C++ 代码是有效的还是未定义的行为?这个想法是能够将您无法控制的 POD 包装到另一个结构中以提供辅助函数,但仍然能够像使用原始 POD 一样使用它。
struct Data
{
...//POD
};
struct Wrapper
{
Data data;//contains only this
void HelperFuncA();
void HelperFuncB();
...//only member functions
};
...
//is this legal?
std::vector<Wrapper> vec_of_wrappers;
Data* array_of_data = reinterpret_cast<Data*>(vec_of_wrappers.data());
现在,此代码无效。有几个原因。首先,将指向结构的第一个成员的指针强制转换为结构本身违反了严格的别名规则。您可以通过使 Wrapper
成为 Data
.
的 child class 来解决这个问题
第二个问题更成问题,因为您正试图以多态方式处理数组(在本例中为向量)。 sizeof Data
不同于 sizeof Wrapper
,因此尝试索引一个 Wrapper
元素的数组,就好像它是一个 Data
元素的数组一样,最终将指向随机区域数组。
此 C++ 代码是有效的还是未定义的行为?这个想法是能够将您无法控制的 POD 包装到另一个结构中以提供辅助函数,但仍然能够像使用原始 POD 一样使用它。
struct Data
{
...//POD
};
struct Wrapper
{
Data data;//contains only this
void HelperFuncA();
void HelperFuncB();
...//only member functions
};
...
//is this legal?
std::vector<Wrapper> vec_of_wrappers;
Data* array_of_data = reinterpret_cast<Data*>(vec_of_wrappers.data());
现在,此代码无效。有几个原因。首先,将指向结构的第一个成员的指针强制转换为结构本身违反了严格的别名规则。您可以通过使 Wrapper
成为 Data
.
第二个问题更成问题,因为您正试图以多态方式处理数组(在本例中为向量)。 sizeof Data
不同于 sizeof Wrapper
,因此尝试索引一个 Wrapper
元素的数组,就好像它是一个 Data
元素的数组一样,最终将指向随机区域数组。