【发布时间】:2020-04-10 14:54:16
【问题描述】:
以下在 C++ 中是否合法? 派生类正在分配基类并将其转换为派生类。 显然,如果派生(C)有成员,任何通过返回的指针访问成员的人都会失败。但即使没有派生成员 - 这是合法的吗? UB?
struct B { int a; };
struct C : B {
static C* get() {
return static_cast<C*>(new B);
}
enum { X, Y,};
};
int main(){
C* c = C::get();
return c->X;
}
【问题讨论】:
-
您提议的演员表是否在此处允许的演员表列表中:en.cppreference.com/w/cpp/language/static_cast - 否?然后违法。我在那儿看不到,但你可以看看。
-
几乎可以肯定是UB,
static_cast到非动态类型感觉就像UB -
只是为了说清楚。这出现在我正在执行并发现的代码审查中。正如人们开始指出的那样,我的观点是——这是一个 UB。寻找可以找到实际 std 子句/段落或类似内容的人。谢谢。
-
这是未定义的行为。在
main()中,指针c不指向C(它指向B),因此取消引用为C会产生未定义的行为。 -
看看那个页面 - 你有没有看到像“除非派生类没有成员”这样的东西?不?那么就没有这样的例外了。
标签: c++ inheritance language-lawyer static-cast