A clock is a bundle consisting of a duration, a
time_point, and a function now() to get the current time_point.

t1 and
t2 are values returned by C1::now() where the call returning t1 happens
before ([intro.multithread]) the call returning t2 and both of these calls
occur
before C1::time_point::max().

Table 96: Cpp17Clock requirements [tab:time.clock]

Expression | Return type | Operational semantics |

C1::rep | An arithmetic type or a class emulating an arithmetic type | The representation type of C1::duration. |

C1::period | a specialization of ratio | The tick period of the clock in seconds. |

C1::duration | chrono::duration<C1::rep, C1::period> | The duration type of the clock. |

C1::time_point | chrono::time_point<C1> or chrono::time_point<C2, C1::duration> | The time_point type of the clock. |

C1::is_steady | const bool | |

C1::now() | C1::time_point | Returns a time_point object representing the current point in time. |

A type TC meets the Cpp17TrivialClock requirements if:

- TC meets the Cpp17Clock requirements ([time.clock.req]),
- the types TC::rep, TC::duration, and TC::time_point
meet the Cpp17EqualityComparable (Table 23) and
Cpp17LessThanComparable (Table 24)
requirements and the requirements of
numeric types ([numeric.requirements]). [ Note: This means, in particular, that operations on these types will not throw exceptions. —]
*end note* - lvalues of the types TC::rep, TC::duration, and TC::time_point are swappable ([swappable.requirements]),
- the function TC::now() does not throw exceptions, and
- the type TC::time_point::clock meets the Cpp17TrivialClock requirements, recursively.