[class.prop] (original) (raw)
11 Classes [class]
11.2 Properties of classes [class.prop]
A trivially copyable class is a class:
- that has at least one eligible copy constructor, move constructor, copy assignment operator, or move assignment operator ([special], [class.copy.ctor], [class.copy.assign]),
- where each eligible copy constructor, move constructor, copy assignment operator, and move assignment operator is trivial, and
- that has a trivial, non-deleted destructor ([class.dtor]).
A trivial class is a class that is trivially copyable and has one or more eligible default constructors ([class.default.ctor]), all of which are trivial.
[ Note
:
In particular, a trivially copyable or trivial class does not have virtual functions or virtual base classes.
— end note
]
A class S is a standard-layout class if it:
- has no non-static data members of type non-standard-layout class (or array of such types) or reference,
- has no virtual functions and novirtual base classes,
- has the same access controlfor all non-static data members,
- has no non-standard-layout base classes,
- has at most one base class subobject of any given type,
- has all non-static data members and bit-fields in the class and its base classes first declared in the same class, and
- has no element of the set M(S) of types as a base class, where for any type X, M(X) is defined as follows.101
[ Note
: M(X) is the set of the types of all non-base-class subobjects that may be at a zero offset in X. — end note
]- If X is a non-union class type with no (possiblyinherited) non-static data members, the setM(X) is empty.
- If X is a non-union class type with a non-static data member of type that is either of zero size or is the first non-static data member of X(where said member may be an anonymous union), the set M(X) consists of and the elements of.
- If X is a union type, the set M(X) is the union of all and the set containing all , where each is the type of the non-static data member of X.
- If X is an array type with element type , the set M(X) consists of and the elements of .
- If X is a non-class, non-array type, the set M(X) is empty.
[ Example
:
struct B { int i; };
struct C : B { };
struct D : C { };
struct E : D { char : 4; };
struct Q {}; struct S : Q { }; struct T : Q { }; struct U : S, T { };
— end example
]
[ Note
:
Standard-layout classes are useful for communicating with code written in other programming languages.
— end note
]
[ Example
:
struct N {
int i;
int j;
virtual ~N();
};
struct T {
int i;
private:
int j;
};
struct SL {
int i;
int j;
~SL();
};
struct POD {
int i;
int j;
};
— end example
]
A class S is an implicit-lifetime classif it is an aggregate or has at least one trivial eligible constructor and a trivial, non-deleted destructor.