std::add_lvalue_reference, std::add_rvalue_reference - cppreference.com (original) (raw)

Defined in header <type_traits>
template< class T > struct add_lvalue_reference; (1) (since C++11)
template< class T > struct add_rvalue_reference; (2) (since C++11)

Creates an lvalue or rvalue reference type of T.

Type trait The type referred by the nested type type
T is a referenceable type T is not a referenceable type
(1) T&[1] T
(2) T&&[2]
  1. This rule reflects the semantics of reference collapsing.
  2. This rule reflects the semantics of reference collapsing. Note that std::add_rvalue_reference<T&>::type is T&, which is not an rvalue reference type.

If the program adds specializations for any of the templates described on this page, the behavior is undefined.

Contents

[edit] Nested types

Name Definition
type determined as above

[edit] Helper types

| template< class T > using add_lvalue_reference_t = typename add_lvalue_reference<T>::type; | | (since C++14) | | -------------------------------------------------------------------------------------------------- | | ------------- | | template< class T > using add_rvalue_reference_t = typename add_rvalue_reference<T>::type; | | (since C++14) |

[edit] Notes

The major difference to directly using T& or T&& is that T can be a non-referenceable type. For example, std::add_lvalue_reference<void>::type is void, while void& leads to a compilation error.

[edit] Possible implementation

namespace detail { template struct type_identity { using type = T; }; // or use std::type_identity (since C++20)   template // Note that “cv void&” is a substitution failure auto try_add_lvalue_reference(int) -> type_identity<T&>; template // Handle T = cv void case auto try_add_lvalue_reference(...) -> type_identity;   template auto try_add_rvalue_reference(int) -> type_identity<T&&>; template auto try_add_rvalue_reference(...) -> type_identity; } // namespace detail   template struct add_lvalue_reference : decltype(detail::try_add_lvalue_reference(0)) {};   template struct add_rvalue_reference : decltype(detail::try_add_rvalue_reference(0)) {};

[edit] Example

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 2101 C++11 the program was ill-formed if T is a function type with cv or ref the type produced is T in this case

[edit] See also