首页 > 解决方案 > 将包含 POD 的包装器结构数组转换为它包含的 POD 类型数组是否合法?

问题描述

这个 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());

标签: c++arraysstructcasting

解决方案


现在,此代码无效。有几个原因。首先,将指向结构的第一个成员的指针转换为结构本身违反了严格的别名规则。您可以通过Wrapper创建Data.

第二个问题更成问题,因为您正试图以多态方式处理数组(在本例中为向量)。sizeof Data与 不同sizeof Wrapper,因此尝试对元素数组进行索引,Wrapper就好像它是Data元素数组一样,最终将指向数组的随机区域。


推荐阅读