[class.prop]

# 11 Classes [[class]](./#class)

## 11.2 Properties of classes [class.prop]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L178)

A [*trivially copyable class*](#def:class,trivially_copyable "11.2 Properties of classes [class.prop]") is a class:

- [(1.1)](#1.1)

that has at least one eligible
copy constructor, move constructor,
copy assignment operator, or
move assignment operator ([[special]](special "11.4.4 Special member functions"), [[class.copy.ctor]](class.copy.ctor "11.4.5.3 Copy/move constructors"), [[class.copy.assign]](class.copy.assign "11.4.6 Copy/move assignment operator")),

- [(1.2)](#1.2)

where each eligible copy constructor, move constructor, copy assignment operator,
and move assignment operator is trivial, and

- [(1.3)](#1.3)

that has a trivial, non-deleted destructor ([[class.dtor]](class.dtor "11.4.7 Destructors"))[.](#1.sentence-1)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L190)

A class C is [*default-movable*](#def:default-movable "11.2 Properties of classes [class.prop]") if

- [(2.1)](#2.1)

overload resolution for direct-initializing an object of type C from an xvalue of type C selects a constructor that is a direct member
of C and is neither user-provided nor deleted,

- [(2.2)](#2.2)

overload resolution for assigning to an lvalue of type C from an
xvalue of type C selects an assignment operator function that is a
direct member of C and is neither user-provided nor deleted, and

- [(2.3)](#2.3)

C has a destructor that is neither user-provided nor deleted.

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L205)

A class is [*eligible for trivial relocation*](#def:eligible_for_trivial_relocation "11.2 Properties of classes [class.prop]") unless it

- [(3.1)](#3.1)

has any virtual base classes,

- [(3.2)](#3.2)

has a base class that is not a trivially relocatable class,

- [(3.3)](#3.3)

has a non-static data member of an object type that is not of a
trivially relocatable type, or

- [(3.4)](#3.4)

has a deleted destructor,

except that it is implementation-defined
whether an otherwise-eligible union having one or more subobjects of
polymorphic class type is eligible for trivial relocation[.](#3.sentence-1)

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L220)

A class C is a [*trivially relocatable class*](#def:class,trivially_relocatable "11.2 Properties of classes [class.prop]") if it is eligible for trivial relocation and

- [(4.1)](#4.1)

has the trivially_relocatable_if_eligible [*class-property-specifier*](class.pre#nt:class-property-specifier "11.1 Preamble [class.pre]"),

- [(4.2)](#4.2)

is a union with no user-declared special member functions, or

- [(4.3)](#4.3)

is default-movable[.](#4.sentence-1)

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L229)

[*Note [1](#note-1)*:

A class with const-qualified or reference non-static data members can be
trivially relocatable[.](#5.sentence-1)

â *end note*]

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L235)

A class C is [*eligible for replacement*](#def:eligible_for_replacement "11.2 Properties of classes [class.prop]") unless

- [(6.1)](#6.1)

it has a base class that is not a replaceable class,

- [(6.2)](#6.2)

it has a non-static data member that is not of a replaceable type,

- [(6.3)](#6.3)

overload resolution fails or selects a deleted constructor when
direct-initializing an object of type C from an xvalue of typeC ([[dcl.init.general]](dcl.init.general "9.5.1 General")),

- [(6.4)](#6.4)

overload resolution fails or selects a deleted assignment operator
function when assigning to an lvalue of type C from an xvalue of typeC ([[expr.assign]](expr.assign "7.6.19 Assignment and compound assignment operators"), [[over.assign]](over.assign "12.4.3.2 Simple assignment")), or

- [(6.5)](#6.5)

it has a deleted destructor[.](#6.sentence-1)

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L252)

A class C is a [*replaceable class*](#def:class,replaceable "11.2 Properties of classes [class.prop]") if it is
eligible for replacement and

- [(7.1)](#7.1)

has the replaceable_if_eligible [*class-property-specifier*](class.pre#nt:class-property-specifier "11.1 Preamble [class.pre]"),

- [(7.2)](#7.2)

is a union with no user-declared special member functions, or

- [(7.3)](#7.3)

is default-movable[.](#7.sentence-1)

[8](#8)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L261)

[*Note [2](#note-2)*:

Accessibility of the special member functions is not considered when
establishing trivial relocatability or replaceability[.](#8.sentence-1)

â *end note*]

[9](#9)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L267)

[*Note [3](#note-3)*:

Not all trivially copyable classes are trivially relocatable or replaceable[.](#9.sentence-1)

â *end note*]

[10](#10)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L272)

A class S is a [*standard-layout class*](#def:class,standard-layout "11.2 Properties of classes [class.prop]") if it:

- [(10.1)](#10.1)

has no non-static data members of type non-standard-layout class
(or array of such types) or reference,

- [(10.2)](#10.2)

has no [virtual functions](class.virtual "11.7.3 Virtual functions [class.virtual]") and no[virtual base classes](class.mi "11.7.2 Multiple base classes [class.mi]"),

- [(10.3)](#10.3)

has the same [access control](class.access "11.8 Member access control [class.access]") for all non-static data members,

- [(10.4)](#10.4)

has no non-standard-layout base classes,

- [(10.5)](#10.5)

has at most one base class subobject of any given type,

- [(10.6)](#10.6)

has all non-static data members and bit-fields in the class and
its base classes first declared in the same class, and

- [(10.7)](#10.7)

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[.](#10.sentence-1)[88](#footnote-88 "This ensures that two subobjects that have the same class type and that belong to the same most derived object are not allocated at the same address ([expr.eq]).")
  [*Note [4](#note-4)*:
  M(X) is the set of the types of all non-base-class subobjects
that can be at a zero offset in X[.](#10.7.sentence-2)
 â *end note*]

  * [(10.7.1)](#10.7.1)

      If X is a non-union class type with no non-static data members,
the set M(X) is empty[.](#10.7.1.sentence-1)

  * [(10.7.2)](#10.7.2)

      If X is a non-union class type with a non-static data
member of type X0 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 X0 and the elements ofM(X0)[.](#10.7.2.sentence-1)

  * [(10.7.3)](#10.7.3)

      If X is a union type, the set M(X) is
the union of all M(Ui) and the set containing all Ui,
where each Ui is the type of the ith non-static data member
of X[.](#10.7.3.sentence-1)

  * [(10.7.4)](#10.7.4)

      If X is an array type with element type Xe,
the set M(X) consists of Xe and the elements of M(Xe)[.](#10.7.4.sentence-1)

  * [(10.7.5)](#10.7.5)

      If X is a non-class, non-array type, the set M(X) is empty[.](#10.7.5.sentence-1)

[11](#11)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L330)

[*Example [1](#example-1)*: struct B { int i; }; // standard-layout classstruct C : B { }; // standard-layout classstruct D : C { }; // standard-layout classstruct E : D { char : 4; }; // not a standard-layout classstruct Q {};struct S : Q { };struct T : Q { };struct U : S, T { }; // not a standard-layout class â *end example*]

[12](#12)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L345)

A [*standard-layout struct*](#def:struct,standard-layout "11.2 Properties of classes [class.prop]") is a standard-layout class
defined with the [*class-key*](class.pre#nt:class-key "11.1 Preamble [class.pre]") struct or the[*class-key*](class.pre#nt:class-key "11.1 Preamble [class.pre]") class[.](#12.sentence-1)

A [*standard-layout union*](#def:union,standard-layout "11.2 Properties of classes [class.prop]") is a standard-layout class
defined with the[*class-key*](class.pre#nt:class-key "11.1 Preamble [class.pre]") union[.](#12.sentence-2)

[13](#13)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L353)

[*Note [5](#note-5)*:

Standard-layout classes are useful for communicating with
code written in other programming languages[.](#13.sentence-1)

Their layout is specified
in [[class.mem.general]](class.mem.general "11.4.1 General") and [[expr.rel]](expr.rel "7.6.9 Relational operators")[.](#13.sentence-2)

â *end note*]

[14](#14)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L360)

[*Example [2](#example-2)*: struct N { // neither trivially copyable nor standard-layoutint i; int j; virtual ~N();};

struct T { // trivially copyable but not standard-layoutint i;private:int j;};

struct SL { // standard-layout but not trivially copyableint i; int j; ~SL();};

struct POD { // both trivially copyable and standard-layoutint i; int j;}; â *end example*]

[15](#15)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L388)

[*Note [6](#note-6)*:

Aggregates of class type are described in [[dcl.init.aggr]](dcl.init.aggr "9.5.2 Aggregates")[.](#15.sentence-1)

â *end note*]

[16](#16)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L393)

A class S is an [*implicit-lifetime class*](#def:class,implicit-lifetime "11.2 Properties of classes [class.prop]") if

- [(16.1)](#16.1)

it is an aggregate whose destructor is not user-provided or

- [(16.2)](#16.2)

it has at least one trivial eligible constructor and
a trivial, non-deleted destructor[.](#16.sentence-1)

[88)](#footnote-88)[88)](#footnoteref-88)

This ensures that two subobjects that have the same class type and that
belong to the same most derived object are not allocated at the same
address ([[expr.eq]](expr.eq "7.6.10 Equality operators"))[.](#footnote-88.sentence-1)
