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] |
- ↑ This rule reflects the semantics of reference collapsing.
- ↑ 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
- 1 Nested types
- 2 Helper types
- 3 Notes
- 4 Possible implementation
- 5 Example
- 6 Defect reports
- 7 See also
[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 |