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

In these tables,

- T denotes an object or reference type to be supplied by a C++ program instantiating a template,
- a, b, and c denote values of type (possibly const) T,
- s and t denote modifiable lvalues of type T,
- u denotes an identifier,
- rv denotes an rvalue of type T, and
- v denotes 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 30: *Cpp17LessThanComparable* requirements [tab:cpp17.lessthancomparable]

Expression | Return type | Requirement | |

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

Table 32: *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 33: *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 34: *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 35: *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 |