C++ named requirements: StandardLayoutType
From cppreference.com
                    
                                        
                    
                    
                                                            
                    Specifies that a type is standard layout type. Standard layout types are useful for communicating with code written in other programming languages.
Note: the standard doesn't define a named requirement with this name. This is a type category defined by the core language. It is included here as a named requirement only for consistency.
Requirements
- All non-static data members have the same access control
 - Has no virtual functions or virtual base classes
 - Has no non-static data members of reference type
 - All non-static data members and base classes are themselves standard layout types
 
 
 
  | 
(until C++14) | 
 struct Q {}; struct S : Q { }; struct T : Q { }; struct U : S, T { }; // not a standard-layout class: two base class subobjects of type Q 
 struct B { int i; }; // standard-layout class struct C : B { }; // standard-layout class struct D : C { }; // standard-layout class struct E : D { char : 4; }; // not a standard-layout class 
 
  | 
(since C++14) | 
Properties
See Standard layout.
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior | 
|---|---|---|---|
| CWG 1672 | C++14 | first non-static data member rule ignored existence of empty base classes | first non-static data member rule made recursive | 
| CWG 1813 | C++14 | class with a member defined in an indirect base wasn't technically standard-layout | all member declarations must be in the same class | 
| CWG 2120 | C++14 | array as first member wasn't considered when comparing the first element type with type of a base | array members are considered | 
See also
|    (C++11)  | 
   checks if a type is a standard-layout type   (class template)  |