20 General utilities library [utilities]

20.15 Metaprogramming and type traits [meta]

20.15.7 Transformations between types [meta.trans]

20.15.7.2 Reference modifications [meta.trans.ref]

Table 46 — Reference modifications
TemplateComments
template <class T>
struct remove_reference;
If T has type “reference to T1” then the member typedef type shall name T1; otherwise, type shall name T.
template <class T>
struct add_lvalue_reference;
If T names a referenceable type ([defns.referenceable]) then the member typedef type shall name T&; otherwise, type shall name T. [ Note: This rule reflects the semantics of reference collapsing ([dcl.ref]).  — end note ]
template <class T>
struct add_rvalue_reference;
If T names a referenceable type then the member typedef type shall name T&&; otherwise, type shall name T. [ Note: This rule reflects the semantics of reference collapsing ([dcl.ref]). For example, when a type T names a type T1&, the type add_rvalue_reference_t<T> is not an rvalue reference.  — end note ]