为什么这个结构体不是标准布局?

5
一行代码胜过千言万语。
#include <iostream>
#include <type_traits>

using namespace std;

struct A
{
    int a;
};

struct B : A
{
    int b;
};

int main()
{
    cout << is_standard_layout<B>::value << endl; // output false! WHY?
    return 0; 
}
1个回答

8

根据标准布局类的定义(第9节类,第7段)

[...]
*在最派生类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
[...]

在您的情况下,最派生类及其基类都有非静态数据成员。因此,它不符合标准布局。


这导致 B b; cout << (reinterpret_cast<int*> (&b) == (&b.b)) << endl; 输出 false。 - Pete Kirkham
@PeteKirkham:这个相关吗?在这里&b == &b.a应该输出true - Matthieu M.
@MatthieuM:是的,我相信Pete的评论很相关。如果“B”是标准布局,则他的表达式将输出true。 - Mat
@Mat:我的观点是,Pete得到的演示是,如果它是标准布局,那么对象的地址将等于其第一个成员的地址。然而,因为它不是标准布局,所以没有定义第一个成员是什么!嗯,在这种情况下,我的定义“深度优先检查到达的第一个对象”肯定和Pete的“广度优先检查到达的第一个对象”一样有效。这有点无意义 :x - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接