[type.descriptions.general]

# 16 Library introduction [[library]](./#library)

## 16.3 Method of description [[description]](description#type.descriptions.general)

### 16.3.3 Other conventions [[conventions]](conventions#type.descriptions.general)

#### 16.3.3.3 Type descriptions [[type.descriptions]](type.descriptions#general)

#### 16.3.3.3.1 General [type.descriptions.general]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L579)

The Requirements subclauses may describe names that are used to specify
constraints on template arguments[.](#1.sentence-1)[137](#footnote-137 "Examples from [utility.requirements] include: Cpp17EqualityComparable, Cpp17LessThanComparable, Cpp17CopyConstructible. Examples from [iterator.requirements] include: Cpp17InputIterator, Cpp17ForwardIterator.")

These names are used in library Clauses
to describe the types that
may be supplied as arguments by a C++ program when instantiating template components from
the library[.](#1.sentence-2)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L597)

Certain types defined in [[input.output]](input.output "31 Input/output library") are used to describe implementation-defined types[.](#2.sentence-1)

They are based on other types, but with added constraints[.](#2.sentence-2)

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

Examples
from [[utility.requirements]](utility.requirements "16.4.4 Requirements on types and expressions") include:*Cpp17EqualityComparable*,*Cpp17LessThanComparable*,*Cpp17CopyConstructible*[.](#footnote-137.sentence-1)

Examples from [[iterator.requirements]](iterator.requirements "24.3 Iterator requirements") include:*Cpp17InputIterator*,*Cpp17ForwardIterator*[.](#footnote-137.sentence-2)
