If T and U can both be explicitly converted to some third type, C, then T and U share a common type, C. [ Note: C could be the same as T, or U, or it could be a different type. C may not be unique. — end note ]
template <class T, class U>
concept bool Common =
Same<common_type_t<T, U>, common_type_t<U, T>> &&
ConvertibleTo<T, common_type_t<T, U>> &&
ConvertibleTo<U, common_type_t<T, U>> &&
CommonReference<
add_lvalue_reference_t<const T>,
add_lvalue_reference_t<const U>> &&
CommonReference<
add_lvalue_reference_t<common_type_t<T, U>>,
common_reference_t<
add_lvalue_reference_t<const T>,
add_lvalue_reference_t<const U>>>;
Let C be common_type_t<T, U>. Let t be a function whose return type is T, and let u be a function whose return type is U. Common<T, U> is satisfied only if:
C(t()) equals C(t()) if and only if t() is an equality preserving expression ([concepts.lib.general.equality]).
C(u()) equals C(u()) if and only if u() is an equality preserving expression ([concepts.lib.general.equality]).
[ Note: Users can customize the behavior of Common by specializing the common_type class template ([meta.unary.prop]). — end note ]