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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2101 | C++11 | 如果 T 是帶有 cv 或 ref 的函式型別,則程式格式錯誤 |
在這種情況下,生成的型別是 T |
[編輯] 參閱
(C++11) |
檢查型別是否為*左值引用*或*右值引用* (類模板) |
(C++11) |
從給定型別中移除引用 (類模板) |
(C++20) |
結合了 std::remove_cv 和 std::remove_reference (類模板) |