小编Jon*_* S.的帖子

非虚拟派生类不能与其第一个基类进行指针互换的基本原理

网站上已经有一些关于结构及其第一个成员变量以及结构及其第一个公共基数的指针可互换性的问题和答案。例如,这个问题就是其中之一。

然而,我感兴趣的不是非标准布局结构与其公共基础之间的未定义行为reinterpret_caststatic_cast通过 a ),而是C++ 标准当前禁止此类强制转换的原因现有的问题和答案不涉及这方面。void *

特别考虑以下示例(Godbolt):

#include <type_traits>

struct Base {
  int m_base_var = 1;
};

struct Derived: public Base {
  int m_derived_var = 2;
};

Derived g_derived;

constexpr Derived *g_pDerived = &g_derived;
constexpr Base *g_pBase = &g_derived;
constexpr void *g_pvDerived = &g_derived;

//These assertions all hold
static_assert(!std::is_pointer_interconvertible_base_of_v<Base, Derived>);
static_assert((void *)g_pDerived == (void *)g_pBase);
static_assert((void *)g_pDerived == g_pvDerived);
static_assert((void *)g_pBase == g_pvDerived);

//This is well-defined and returns &g_derived …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance strict-aliasing language-lawyer reinterpret-cast

5
推荐指数
1
解决办法
129
查看次数