std::add_lvalue_reference, std::add_rvalue_reference
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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
|
ヘルパー型
<tbody> </tbody> 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 を合わせたもの (クラステンプレート) |