Rus*_*lan 11 c++ downcast undefined-behavior
考虑这个例子,其中基类有一些数据成员,而派生类只提供了一个额外的方法:
struct TestBase
{
int x;
TestBase() : x(5) {}
};
struct TestDerived : public TestBase
{
void myMethod()
{
x=8;
}
};
int main()
{
TestBase b;
TestDerived& d=static_cast<TestDerived&>(b);
d.myMethod();
}
Run Code Online (Sandbox Code Playgroud)
这是向下错误的类型,所以AFAIU它有未定义的行为.但是这样的情况可能会有一些例外吗,派生类的布局与基类的布局相同?
从标准(强调我的):
§5.2.9静态演员[expr.static.cast] ......
(2)类型的左值"CV1 B",其中B是一个类型, 可以转换为输入"参照CV2 d",其中 d是从乙派生的类,如果来自"指针的有效标准转换到d "到'指针到B’的存在,CV2是相同的CV-资格,或更大的CV-资格比,CV1,和B既不是虚基类d的也不是基类的虚拟基类d的的结果已经输入"CV2 D."类型"CV1 B"的一个x值可以被转换为类型"右值参照CV2 d"以相同的约束条件作为用于类型"CV1 B"的左值 如果type"CV1的对象B"实际上是D类型对象的子对象,结果是指D类型的封闭对象. 否则,行为是未定义的.
我的第一个猜测是在这种情况下演员应该是有效的,因为我对术语子对象感到困惑.
现在(感谢@TC和@MM),显然在这种情况下行为是未定义的.
演员在以下示例中有效:
int main()
{
TestDerived d;
TestBase &br = d; // reference to a subobject of d
TestDerived &dr = static_cast<TestDerived&>(br); // reference to the original d object
d.myMethod();
}
Run Code Online (Sandbox Code Playgroud)
这里,class TestDerived(d)的对象将有一个class的子对象TestBase(br是对该对象的引用).
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |