C++ 将_cast重新解释为更小的数组安全吗?有更好的选择吗?

C++ 将_cast重新解释为更小的数组安全吗?有更好的选择吗?,c++,pointers,vector,reinterpret-cast,C++,Pointers,Vector,Reinterpret Cast,假设我有一个自定义向量类型: 模板 类向量{ 公众: 矢量(常数D*arrayPtr) { memcpy(m_array.data(),arrayPtr,sizeof(D)*N); } …运算符、方法等。。。 std::数组m_数组; }; 因此,我实例化了一个新的向量指针。但是,有时我想将其视为向量。这样做安全吗 Vector4*myVec4=新的Vector4(1,2,3,4); Vector3*myVec3=重新解释铸型(myVec4); 我假设“可能”,因为类在内存中是连续的,并且没

假设我有一个自定义向量类型:

模板
类向量{
公众:
矢量(常数D*arrayPtr)
{
memcpy(m_array.data(),arrayPtr,sizeof(D)*N);
}
…运算符、方法等。。。
std::数组m_数组;
};
因此,我实例化了一个新的
向量
指针。但是,有时我想将其视为
向量
。这样做安全吗

Vector4*myVec4=新的Vector4(1,2,3,4);
Vector3*myVec3=重新解释铸型(myVec4);

我假设“可能”,因为类在内存中是连续的,并且没有任何虚拟方法。但是,在我做出任何危险的动作之前,我想非常确定。

不,这不安全,因为通过不兼容的指针访问对象会导致未定义的行为


为了实现类似的功能,您可以使用一个类,例如
Vector3View
,它间接引用较大的向量。

我认为不会,因为这违反了严格的别名。几周前我问过,结论是这不是一个安全的演员阵容。是的,重新诠释演员阵容是不安全的。根据经验,如果有必要通过添加
\u cast
强制编译器接受转换来迫使编译器提交,那么使用
\u cast
的结果是不安全的。(更正式的描述是你违反了严格的别名规则)。@彼得:我认为这不准确<代码>静态_-cast
动态_-cast
几乎总是安全的。只有
重新解释施法
常量施法
才是危险的。@Secundi:我被纠正了。我不知道一个
static_cast
对于Downcast是有效的。这并不奇怪,我也在考虑遵循这样一种模式,这只是暂时付出的努力超过了它的价值。谢谢