c++ - 将包含 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());
解决方案
现在,此代码无效。有几个原因。首先,将指向结构的第一个成员的指针转换为结构本身违反了严格的别名规则。您可以通过Wrapper
创建Data
.
第二个问题更成问题,因为您正试图以多态方式处理数组(在本例中为向量)。sizeof Data
与 不同sizeof Wrapper
,因此尝试对元素数组进行索引,Wrapper
就好像它是Data
元素数组一样,最终将指向数组的随机区域。
推荐阅读
- java - 构建通用 Lucene 查询以针对多个实体运行时如何排除或忽略字段
- android - Android Studio:在链接的 C++ 库中传递了错误的 JNI 版本
- android - OpenTok Android 信令教程 - 会话错误域
- javascript - Array.includes 的功能使用导致 TypeError
- php - Laravel hasMany to Belongs 返回 undefined
- python - TensorFlow conv1d_transpose 过滤器值
- javascript - 执行包返回:Haste 模块映射中不存在模块 util
- apache-kafka - kafka-streams 加入产生重复项
- azure - 如何在 AzureFunction 日志中查看异常信息
- sql - 如何区分转换中的插入和更新