2012-12-16 58 views
4

一段代码胜过千言万语。为什么这个结构不是标准布局?

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

回答

7

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

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

两个最派生的类和其基地在你的情况下有非静态数据成员。所以这不是标准布局。

+0

其中有'B b; cout <<(reinterpret_cast (&b)==(&b.b))<< endl;'输出false。 –

+0

@PeteKirkham:这与此有关吗? '&b ==&b.a'应该在这里输出'true'。 –

+0

@MatthieuM .:是的,我相信皮特的评论是相关的。如果“B”是标准布局,他的表达式将会输出真值。 – Mat