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 86 — Cpp17Clock requirements

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:

- the types TC::rep, TC::duration, and TC::time_point satisfy the Cpp17EqualityComparable (Table 23), Cpp17LessThanComparable (Table 24), Cpp17DefaultConstructible (Table 25), Cpp17CopyConstructible (Table 27), Cpp17CopyAssignable (Table 29), and Cpp17Destructible (Table 30) requirements and the requirements of numeric types ([numeric.requirements]).
- 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