这能保证是安全的演员阵容吗?

Is this guaranteed to be a safe cast?

本文关键字:安全      更新时间:2023-10-16

请考虑以下定义:

struct A {
   // ...
};
struct B : public A {}; // empty
void f(B& b) { /* use b */}
void g(A& a) {
   f(static_cast<B&>(a)); // is this a safe downcast?
}
int main() {
   A a;
   g(a);
}

在上面的例子中,a实际上是A的一个实例。

由于B有一个空的定义,我想知道在这种特定情况下,对 f 的调用及其执行是否是未定义的行为。

不,这不是合法强制转换,因为它是在非类型 B 的对象上执行的。程序具有未定义的行为。

根据 C++11 标准第 5.2.9/2 段:

类型为">cv1 B"的左值,其中B是类类型,可以转换为类型"对 cv2 D的引用",其中D是一个类 从B派生(条款 10(,如果存在从"指向D的指针"到"指向B的指针"的有效标准转换 (4.10(, CV2 与 CV1 具有相同的 CV 资格,或比 CV1 更高的 CV 资格,并且B既不是虚拟基类 的D也不是D的虚拟基类的基类。结果的类型为">cv2 D "。类型为">cv1 B"的 xvalue 可以转换为类型"对 cv2 D 的右值引用",其约束与类型为">cv1 B"的左值相同。 如果类型为"cv1 B"的对象实际上是类型为D对象的子对象,则结果是指封闭 类型 D 的对象。否则,行为是未定义的

No.不管你说的安全是什么意思,那个强制转换是不正确的,真正的对象是类型 A ,而不是B所以你不能向下投射到B