为何MSVC允许实例化带protected析构的EntityBase?合规性与UB疑问
C++ protected析构函数与未定义行为问题解答
问题1:MSVC与Clang/GCC谁的行为符合C++标准?
Clang/GCC的行为符合C++标准,MSVC的行为属于非标准扩展。
根据C++标准,当类的析构函数被声明为protected时,类外部的代码(既非该类的派生类,也非友元)无法合法创建该类的实例——因为对象生命周期结束时必须调用析构函数,而外部代码没有权限访问protected级别的析构函数。
MSVC在EntityBase与派生类大小一致时允许直接实例化基类,这是它特有的非标准行为;当派生类添加成员后,MSVC拒绝实例化的操作才符合标准要求。
问题2:若Face无额外成员且为平凡可析构类型,通过EntityBase指针删除Face是否仍属于未定义行为?
是的,该操作仍然属于未定义行为。
C++标准明确规定:通过基类指针删除派生类对象时,基类必须拥有虚析构函数,否则行为未定义。这个规则不依赖于派生类是否包含额外成员,也不依赖于析构函数是否为平凡类型——只要基类没有虚析构函数,此类操作的行为就是未定义的,即便编译器执行时看似正常,也绝对不能依赖这种行为。
内容的提问来源于stack exchange,提问作者Stefano Bellotti
相关产品推荐
相关产品推荐

