Files
2025-10-25 03:02:53 +03:00

63 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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.4Concept convertible_­to[concept.convertible]")<T, C> and[convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept 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.5Concept common_­reference_­with[concept.commonref]") =
[same_as](concept.same#concept:same_as "18.4.2Concept same_­as[concept.same]")<common_reference_t<T, U>, common_reference_t<U, T>> &&
[convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept convertible_­to[concept.convertible]")<T, common_reference_t<T, U>> &&
[convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept 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.2Equality 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.5Concept 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.5Concept common_­reference_­with[concept.commonref]") by specializing
the basic_common_reference class template ([[meta.trans.other]](meta.trans.other "21.3.9.7Other transformations"))[.](#3.sentence-1)
— *end note*]