std::add_lvalue_reference, std::add_rvalue_reference
来自 cppreference.com
定义在头文件 <type_traits> 中 |
||
template< class T > struct add_lvalue_reference; |
(1) | (自 C++11 起) |
template< class T > struct add_rvalue_reference; |
(2) | (自 C++11 起) |
创建 T
的左值或右值引用类型。
类型特征 | 嵌套类型 type 所指的类型 | |
---|---|---|
T 是 可引用类型 |
T 不是可引用类型 | |
(1) | T& [1] |
T
|
(2) | T&& [2] |
如果程序为本页上描述的任何模板添加了特化,则行为未定义。
内容 |
[编辑] 嵌套类型
名称 | 定义 |
类型
|
如上所述 |
[编辑] 辅助类型
template< class T > using add_lvalue_reference_t = typename add_lvalue_reference<T>::type; |
(自 C++14 起) | |
template< class T > using add_rvalue_reference_t = typename add_rvalue_reference<T>::type; |
(自 C++14 起) | |
[编辑] 说明
与直接使用 T&
或 T&&
的主要区别在于 T
可以是非 可引用 类型。例如,std::add_lvalue_reference<void>::type 是 void,而 void& 会导致编译错误。
[编辑] 可能的实现
namespace detail { template<class T> struct type_identity { using type = T; }; // or use std::type_identity (since C++20) template<class T> // Note that “cv void&” is a substitution failure auto try_add_lvalue_reference(int) -> type_identity<T&>; template<class T> // Handle T = cv void case auto try_add_lvalue_reference(...) -> type_identity<T>; template<class T> auto try_add_rvalue_reference(int) -> type_identity<T&&>; template<class T> auto try_add_rvalue_reference(...) -> type_identity<T>; } // namespace detail template<class T> struct add_lvalue_reference : decltype(detail::try_add_lvalue_reference<T>(0)) {}; template<class T> struct add_rvalue_reference : decltype(detail::try_add_rvalue_reference<T>(0)) {}; |
[编辑] 示例
运行此代码
#include <type_traits> using non_ref = int; static_assert(std::is_lvalue_reference_v<non_ref> == false); using l_ref = std::add_lvalue_reference_t<non_ref>; static_assert(std::is_lvalue_reference_v<l_ref> == true); using r_ref = std::add_rvalue_reference_t<non_ref>; static_assert(std::is_rvalue_reference_v<r_ref> == true); using void_ref = std::add_lvalue_reference_t<void>; static_assert(std::is_reference_v<void_ref> == false); int main() {}
[编辑] 缺陷报告
以下更改行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 2101 | C++11 | 如果 T 是具有 cv 或 ref 的 函数类型,则程序格式错误 |
在这种情况下产生的类型是 T |
[编辑] 另请参阅
(C++11) |
检查类型是否为左值引用或右值引用 (类模板) |
(C++11) |
从给定类型中删除引用 (类模板) |
(C++20) |
组合 std::remove_cv 和 std::remove_reference (类模板) |