std:: add_lvalue_reference, std:: add_rvalue_reference
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ヘッダーで定義
<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]
|
|
- ↑ このルールは reference collapsing のセマンティクスを反映しています。
-
↑
このルールは
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
である
|
関連項目
|
(C++11)
|
型が
lvalue reference
または
rvalue reference
のいずれかであるかどうかをチェックする
(class template) |
|
(C++11)
|
指定された型から参照を除去する
(class template) |
|
(C++20)
|
std::remove_cv
と
std::remove_reference
を組み合わせる
(class template) |