我试图理解什么时候可以通过指向空的指针安全地将派生对象转换到基子对象(我认为它应该与reinterpret_cast相同)。但“标准”在这方面的措辞,我能找到,让我感到困惑。首先,
如果以下情况下,
两个对象a和b是指针可互换的:
-一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则为该对象的第一个基类子对象。
因此,无论“或”是否适用于“或”之前的整个分句,或仅适用于第二部分,都不能得出可靠的结论。这一点很重要,因为我无法确定在没有非静态数据成员的情况下,“标准布局类对象”是否是指针-子对象与基子对象的可转换性的必要条件。
但是,在深入研究标准的同时,我发现:
如果标准布局类对象有任何非静态数据成员,则其地址与其第一个非静态数据成员的地址相同。否则,它的地址与它的第一个基类子对象的地址相同(如果有的话)。
这似乎更清楚的是,“标准布局”是必需的。但还是很困惑。考虑以下代码:
class B { public: int b; };
class C : public B { public: int c; };
int main ()
{
C c;
B* b = &c;
std::cout << &c << " address of standard-layout class object\n";
std::cout << &c.c << " address of its first non-static data member\n";
std::cout << b << " address of first base class subobject\n";
return 0;
}在VS2019上,结果是:
009BFBF8 address of standard-layout class object
009BFBFC address of its first non-static data member
009BFBF8 address of first base class subobject标准不是这么说的。你能解释一下吗?
发布于 2020-10-07 10:26:00
重点在于标准布局类的定义。来自http://www.cplusplus.com/reference/type_traits/is_standard_layout/
标准布局类是一个类(用类、结构或联合定义):
。
在您的示例中,类C与第三条规则不匹配,因此不是标准布局类。
另外,关于“或”的问题,它只适用于第二部分,即“或”之后的语句仍然是关于标准布局类对象的,但没有非静态成员。
https://stackoverflow.com/questions/64241683
复制相似问题