【发布时间】:2021-12-22 11:57:32
【问题描述】:
这个 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出现在开头)? -
如果是
vec_of_wrappers(1),那么它在某些系统上可能是有效的,否则data()就是nullptr -
@PaulSanders 在第一个元素之前永远不会有填充,这是标准保证的。该代码由于其他原因是非法的(请参阅我的回答)
-
Data* array_of_data = reinterpret_cast<Data*>(vec_of_wrappers.data());是未定义行为的开始(对于实际 UB,您需要取消引用array_of_data),因为上述代码中不存在 reinterpret_cast 的允许转换。请参阅上述链接中的类型别名部分。