[concept.commonref]

# 18 Concepts library [[concepts]](./#concepts)

## 18.4 Language-related concepts [[concepts.lang]](concepts.lang#concept.commonref)

### 18.4.5 Concept common_reference_with [concept.commonref]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L390)

For two types T and U, if common_reference_t<T, U> is well-formed and denotes a type C such that both[convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]")<T, C> and[convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]")<U, C> are modeled, then T and U share a[*common reference type*](#def:common_reference_type), C[.](#1.sentence-1)

[*Note [1](#note-1)*:

C can be the same as T or U, or can be a
different type[.](#1.sentence-2)

C can be a reference type[.](#1.sentence-3)

â *end note*]

[ð](#concept:common_reference_with)

`template<class T, class U>
  concept [common_reference_with](#concept:common_reference_with "18.4.5 Concept common_­reference_­with [concept.commonref]") =
    [same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")<common_reference_t<T, U>, common_reference_t<U, T>> &&
    [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]")<T, common_reference_t<T, U>> &&
    [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]")<U, common_reference_t<T, U>>;
`

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L412)

Let C be common_reference_t<T, U>[.](#2.sentence-1)

Let t1 and t2 be equality-preserving
expressions ([[concepts.equality]](concepts.equality "18.2 Equality preservation")) such thatdecltype((t1)) and decltype((t2)) are each T, and
let u1 and u2 be equality-preserving expressions such thatdecltype((u1)) and decltype((u2)) are each U[.](#2.sentence-2)

T and U model [common_reference_with](#concept:common_reference_with "18.4.5 Concept common_­reference_­with [concept.commonref]")<T, U> only if

- [(2.1)](#2.1)

C(t1) equals C(t2) if and only if t1 equals t2, and

- [(2.2)](#2.2)

C(u1) equals C(u2) if and only if u1 equals u2[.](#2.sentence-3)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L428)

[*Note [2](#note-2)*:

Users can customize the behavior of [common_reference_with](#concept:common_reference_with "18.4.5 Concept common_­reference_­with [concept.commonref]") by specializing
the basic_common_reference class template ([[meta.trans.other]](meta.trans.other "21.3.9.7 Other transformations"))[.](#3.sentence-1)

â *end note*]
