【问题标题】:Why is this struct not standard-layout?为什么这个结构不是标准布局?
【发布时间】:2012-12-16 10:32:40
【问题描述】:

一段代码胜过千言万语。

#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; 
}

【问题讨论】:

    标签: c++ c++11 struct typetraits standard-layout


    【解决方案1】:

    来自标准布局类的定义(§9 类,第 7 段)

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

    在您的情况下,最派生类及其基类都具有非静态数据成员。所以这不是标准布局。

    【讨论】:

    • B b; cout &lt;&lt; ( reinterpret_cast&lt;int*&gt; ( &amp;b ) == ( &amp;b.b ) ) &lt;&lt; endl;输出false的效果。
    • @PeteKirkham:这有关系吗? &amp;b == &amp;b.a 应该在这里输出true
    • @MatthieuM.:是的,我相信皮特的评论是相关的。如果 B 是标准布局,他的表达式将输出 true。
    • @Mat:我的意思是,Pete 得到的演示是,如果它是标准布局,那么对象的地址将等于其第一个成员的地址。但是,因为它不是标准布局,所以没有定义第一个成员是什么!好吧,在这种情况下,我的定义“深度优先检测到达的第一个对象”肯定与皮特的“广度优先检测到达的第一个对象”一样有效。这真的有点没有实际意义:x
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多