The template definitions in the C++ standard library
refer to various named requirements whose details are set out in
Tables 27–34.

In these tables, T is an object or reference type to be
supplied by a C++ program instantiating a template;
a,
b, and
c are values of type (possibly const) T;
s and t are modifiable lvalues of type T;
u denotes an identifier;
rv is an rvalue of type T;
and v is an lvalue of type (possibly const) T or an rvalue of
type const T.

In general, a default constructor is not required.

Certain container class
member function signatures specify T() as a default argument.

T() shall be a well-defined expression ([dcl.init]) if one of those
signatures is called using the default argument.

Table 28: *Cpp17LessThanComparable* requirements [tab:cpp17.lessthancomparable]

Expression | Return type | Requirement | |

a < b | convertible to bool | < is a strict weak ordering relation ([alg.sorting]) |

Table 30: *Cpp17MoveConstructible* requirements [tab:cpp17.moveconstructible]

Expression | Post-condition | |

T u = rv; | u is equivalent to the value of rv before the construction | |

T(rv) | T(rv) is equivalent to the value of rv before the construction | |

Table 31: *Cpp17CopyConstructible* requirements (in addition to *Cpp17MoveConstructible*) [tab:cpp17.copyconstructible]

Expression | Post-condition | |

T u = v; | the value of v is unchanged and is equivalent to u | |

T(v) | the value of v is unchanged and is equivalent to T(v) |

Table 32: *Cpp17MoveAssignable* requirements [tab:cpp17.moveassignable]

Expression | Return type | Return value | Post-condition | |

t = rv | T& | t | If t and rv do not refer to the same object,
t is equivalent to the value of rv before the assignment | |

Table 33: *Cpp17CopyAssignable* requirements (in addition to *Cpp17MoveAssignable*) [tab:cpp17.copyassignable]

Expression | Return type | Return value | Post-condition | |

t = v | T& | t | t is equivalent to v, the value of v is unchanged |