Namespaces
Variants

std:: add_lvalue_reference, std:: add_rvalue_reference

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
add_lvalue_reference add_rvalue_reference
(C++11) (C++11)

Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
ヘッダーで定義 <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]
  1. このルールは reference collapsing のセマンティクスを反映しています。
  2. このルールは reference collapsing のセマンティクスを反映しています。 std :: add_rvalue_reference < T & > :: type T& であり、これは右辺値参照型ではないことに注意してください。

プログラムがこのページで説明されているテンプレートのいずれかに対する特殊化を追加する場合、動作は未定義です。

目次

ネストされた型

名前 定義
type 上記のように決定される

ヘルパー型

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 referenceable でない型でも構わない点です。例えば、 std :: add_lvalue_reference < void > :: type void となりますが、 void & はコンパイルエラーを引き起こします。

実装例

namespace detail
{
    template<class T>
    struct type_identity { using type = T; }; // または std::type_identity を使用 (C++20以降)
    template<class T> // 「cv void&」は置換失敗となることに注意
    auto try_add_lvalue_reference(int) -> type_identity<T&>;
    template<class T> // T = cv void の場合を処理
    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 function type cv または ref を持つ場合、プログラムは不適格であった この場合、生成される型は T である

関連項目

型が lvalue reference または rvalue reference のいずれかであるかどうかをチェックする
(class template)
指定された型から参照を除去する
(class template)
std::remove_cv std::remove_reference を組み合わせる
(class template)