【发布时间】:2021-03-02 07:40:55
【问题描述】:
所以,假设我有一个自定义向量类型:
template <class D, size_t N>
class Vector {
public:
Vector(const D* arrayPtr)
{
memcpy(m_array.data(), arrayPtr, sizeof(D)*N);
}
... operators, methods, etc ...
std::array<D, N> m_array;
};
所以,我实例化了一个新的Vector<double, 4> 指针。但是,有时我想将其视为Vector<double, 3>。执行以下操作是否安全?
Vector4* myVec4 = new Vector4(1, 2, 3, 4);
Vector3* myVec3 = reinterpret_cast<Vector3*>(myVec4);
我会假设“可能”,因为该类在内存中是连续的,并且没有任何虚拟方法。不过,在我采取任何冒险行动之前,我想非常确定。
【问题讨论】:
-
我认为不会,因为这违反了严格混叠。几周前我问了一个similar question,结论是这不是一个安全的演员。
-
converting constructor 的理想人选。
-
不,
reinterpret_cast不安全。根据经验,如果有必要通过添加_cast强制编译器接受转换来使编译器提交,那么使用_cast的结果是不安全的。 (更正式的描述是您违反了严格的别名规则)。 -
@Peter:我认为这不准确。
static_cast和dynamic_cast几乎总是安全的。只有reinterpret_cast和const_cast很危险。 -
@Secundi:我的立场是正确的。我不知道
static_cast完全适用于沮丧。 coliru.stacked-crooked.com/a/a3c5bd033c523d07
标签: c++ pointers vector reinterpret-cast