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
の左辺値参照型または右辺値参照型を作成します。
1)
T
がオブジェクト型または cv 修飾も参照修飾もされていない関数型であれば、 T&
であるメンバ型 type
が提供されます。 T
が何らかの型 U
の右辺値参照であれば、 type
は U&
です。 そうでなければ、 type
は T
です。2)
T
がオブジェクト型または cv 修飾も参照修飾もされていない関数型であれば、 T&&
であるメンバ型 type
が提供されます。 そうでなければ type
は T
です。目次 |
[編集]メンバ型
名前 | 定義 |
type | T への参照、またはそれが許されない場合は T |
[編集]ヘルパー型
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以上) | |
[編集]ノート
これらの型変換は参照の縮約のルールを尊重します。
- std::add_lvalue_reference<T&>::type は T& です。
- std::add_lvalue_reference<T&&>::type は T& です。
- std::add_rvalue_reference<T&>::type は T& です。
- std::add_rvalue_reference<T&&>::type は T&& です。
T& を直接使うこととの主な違いは、 void& はコンパイルエラーとなりますが、 std::add_lvalue_reference<void>::type は void となることです。
[編集]実装例
namespace detail { template<class T>struct type_identity {using type = T;};// または std::type_identity (C++20以上) を使用します template<class T>auto try_add_lvalue_reference(int)-> type_identity<T&>;template<class T>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)){}; |
[編集]例
Run this code
#include <iostream>#include <type_traits> int main(){using nonref =int;using lref =typename std::add_lvalue_reference<nonref>::type;using rref =typename std::add_rvalue_reference<nonref>::type; std::cout<<std::boolalpha;std::cout<<std::is_lvalue_reference<nonref>::value<<'\n';std::cout<<std::is_lvalue_reference<lref>::value<<'\n';std::cout<<std::is_rvalue_reference<rref>::value<<'\n';}
出力:
false true true
[編集]欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
DR | 適用先 | 発行時の動作 | 正しい動作 |
---|---|---|---|
LWG 2101 | C++11 | These transformation traits were required to produce reference to cv-/ref-qualified function types. | Produce cv-/ref-qualified function types themselves. |
[編集]関連項目
(C++11) | 型が左辺値参照または右辺値参照かどうか調べます (クラステンプレート) |
(C++11) | 指定された型から参照を削除します (クラステンプレート) |
(C++20) | std::remove_cv と std::remove_reference を合わせたもの (クラステンプレート) |