网站上已经有一些关于结构及其第一个成员变量以及结构及其第一个公共基数的指针可互换性的问题和答案。例如,这个问题就是其中之一。
然而,我感兴趣的不是非标准布局结构与其公共基础之间的未定义行为(reinterpret_cast或static_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