在C 中访问带有不正确的下属的基类成员



以下C 代码是否正确?

struct Base { int x; };
struct Derived : Base { int y; }
Base * b = new Base;
Derived * d = static_cast<Derived *>(b);
//below we access only d->x, but not d->y
std::cout << d->x;

如果没有,到底出了什么问题?C 标准对此有何评价?至少我从未看到它崩溃了。

这在[expr.static.cast]/11(重点是我的)中相当简单。

可以将B是类型的"指针到CV1 B"的类型类型,可以转换为" CV2 D指针"类型的prvalue,其中D是源自B ,如果CV2与CV1相同或CV-CV1相同或更大的CV值。如果b是D的虚拟基类或D虚拟基类的d的虚拟基类,或者没有从"指针到D"到"指针到B"的有效标准转换([[cons.ptr]),则该程序是不构建的。NULL指针值转换为目标类型的空指针值。如果类型为"指针到CV1 B"的Prvalue指向B类型D类型对象的子对象的B,则结果指针指向类型D的封闭对象D。否则,该行为是不确定的。/strong>

您没有Derived的子对象,所以它是未定义的行为。


请注意,没有特殊案例或XVALUE指针,并且/8提到操作数经历了LVALUE到RVALUE转换。

最新更新