[tuple.common.ref]

# 22 General utilities library [[utilities]](./#utilities)

## 22.4 Tuples [[tuple]](tuple#common.ref)

### 22.4.10 common_reference related specializations [tuple.common.ref]

[1](#1)

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

In the descriptions that follow:

- [(1.1)](#1.1)

  Let TTypes be a pack formed by
the sequence of tuple_element_t<i, TTuple> for every integer 0â¤i<tuple_size_v<TTuple>[.](#1.1.sentence-1)

- [(1.2)](#1.2)

  Let UTypes be a pack formed by
the sequence of tuple_element_t<i, UTuple> for every integer 0â¤i<tuple_size_v<UTuple>[.](#1.2.sentence-1)

[ð](#lib:basic_common_reference,tuple)

`template<[tuple-like](tuple.like#concept:tuple-like "22.4.3 Concept tuple-like [tuple.like]") TTuple, [tuple-like](tuple.like#concept:tuple-like "22.4.3 Concept tuple-like [tuple.like]") UTuple,
         template<class> class TQual, template<class> class UQual>
struct basic_common_reference<TTuple, UTuple, TQual, UQual> {
  using type = see below;
};
`

[2](#2)

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

*Constraints*: 

- [(2.1)](#2.1)

  TTuple is a specialization of tuple orUTuple is a specialization of tuple[.](#2.1.sentence-1)

- [(2.2)](#2.2)

  is_same_v<TTuple, decay_t<TTuple>> is true[.](#2.2.sentence-1)

- [(2.3)](#2.3)

  is_same_v<UTuple, decay_t<UTuple>> is true[.](#2.3.sentence-1)

- [(2.4)](#2.4)

  tuple_size_v<TTuple> equals tuple_size_v<UTuple>[.](#2.4.sentence-1)

- [(2.5)](#2.5)

  tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...> denotes a type[.](#2.5.sentence-1)

The member [*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4 The typedef specifier [dcl.typedef]") type denotes the typetuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>[.](#2.sentence-2)

[ð](#lib:common_type,tuple)

`template<[tuple-like](tuple.like#concept:tuple-like "22.4.3 Concept tuple-like [tuple.like]") TTuple, [tuple-like](tuple.like#concept:tuple-like "22.4.3 Concept tuple-like [tuple.like]") UTuple>
struct common_type<TTuple, UTuple> {
  using type = see below;
};
`

[3](#3)

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

*Constraints*: 

- [(3.1)](#3.1)

  TTuple is a specialization of tuple orUTuple is a specialization of tuple[.](#3.1.sentence-1)

- [(3.2)](#3.2)

  is_same_v<TTuple, decay_t<TTuple>> is true[.](#3.2.sentence-1)

- [(3.3)](#3.3)

  is_same_v<UTuple, decay_t<UTuple>> is true[.](#3.3.sentence-1)

- [(3.4)](#3.4)

  tuple_size_v<TTuple> equals tuple_size_v<UTuple>[.](#3.4.sentence-1)

- [(3.5)](#3.5)

  tuple<common_type_t<TTypes, UTypes>...> denotes a type[.](#3.5.sentence-1)

The member [*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4 The typedef specifier [dcl.typedef]") type denotes the typetuple<common_type_t<TTypes, UTypes>...>[.](#3.sentence-2)
