- functional[meta header]
- std[meta namespace]
- class template[meta id-type]
- cpp11[meta cpp]
namespace std {
template <class T>
class reference_wrapper;
}
reference_wrapper
は、コピー・代入可能なオブジェクトとして持ちまわれる参照オブジェクトを提供する。コピー不可なクラス (例:std::istream
) をポインタで保持する代わりにreference_wrapper
で保持することができる。また、reference_wrapper
クラスは、関数テンプレートに変数を参照として渡すためにも使用できる。
C++17からは、このクラスはトリビアルコピー可能であると規定された。
また、C++20からは、テンプレートパラメーターT
は不完全型をサポートしている。
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++11 |
~reference_wrapper() = default; |
デストラクタ | C++11 |
operator= |
代入演算子 | C++11 |
get |
生参照の取得 | C++11 |
operator T&() |
生参照への変換 | C++11 |
operator() |
関数オブジェクト呼び出し | C++11 |
名前 | 説明 | 対応バージョン |
---|---|---|
type |
参照される型 (テンプレートパラメータ T ) |
C++11 |
result_type |
型T を関数・関数オブジェクトとして扱った時の戻り値型 |
C++11 C++17から非推奨 C++20で削除 |
argument_type |
型T を一引数の関数・関数オブジェクトとして扱った時の引数型 |
C++11 C++17から非推奨 C++20で削除 |
first_argument_type |
型T を二引数の関数・関数オブジェクトとして扱った時の第一引数型 |
C++11 C++17から非推奨 C++20で削除 |
second_argument_type |
型T を二引数の関数・関数オブジェクトとして扱った時の第二引数型 |
C++11 C++17から非推奨 C++20で削除 |
名前 | 説明 | 対応バージョン |
---|---|---|
ref |
T& に対応するreference_wrapper オブジェクトの生成 |
C++11 |
cref |
const T& に対応するreference_wrapper オブジェクトの生成 |
C++11 |
名前 | 説明 | 対応バージョン |
---|---|---|
(deduction_guide) |
クラステンプレートの推論補助 | C++17 |
#include <iostream>
#include <functional>
void f(int& x)
{
++x;
}
template <class T>
void g(T x)
{
f(x);
}
int main()
{
int x = 3;
// 関数テンプレートの型推論によって、xの型が非参照のintと見なされる
//g(x);
// 関数テンプレートに変数を参照として渡す
g(std::ref(x));
std::cout << x << std::endl;
}
- std::ref[link ref.md]
4
#include <functional>
#include <iostream>
struct my_struct;
my_struct& get_my_struct();
int main()
{
[[maybe_unused]]
std::reference_wrapper<my_struct> s = get_my_struct(); // 不完全型 my_struct の使用
}
struct my_struct
{
void hello() { std::cout << "Hello, world!"; }
};
my_struct& get_my_struct()
{
static my_struct obj = my_struct{};
return obj;
}
0
- C++11
- Clang: ??
- GCC:
- GCC, C++11 mode: 4.7.0
- ICC: ??
- Visual C++: ??