std::reference_wrapper。<functional>ヘッダで提供される、参照をコピー可能・代入可能な形で保持するラッパー。
参照のようにオブジェクトを参照できるが、参照そのものと違ってコピーや代入ができる。
そのため、std::vectorのようなコンテナに「参照のようなもの」を格納したいときに使う。
たとえば、通常の参照は再束縛できないため、コンテナの要素型としてそのまま扱いにくい。
std::vector<const Teacher&> teachers; // エラーこのような場合に、std::reference_wrapperを使う。
std::vector<std::reference_wrapper<const Teacher>> teachers;std::reference_wrapperから元のオブジェクトを取り出すには、get()メンバ関数を使う。
また、場面によっては T& として暗黙的に使える。
for (auto teacher : teachers)
{
std::cout << teacher.get().getName() << '\n';
}std::refとstd::cref
std::reference_wrapperオブジェクトを生成する補助関数。
std::ref は変更可能な参照を、std::cref は const 参照を包みたいときに使う。
int x { 5 };
auto ref { std::ref(x) }; // std::reference_wrapper<int>
auto cref { std::cref(x) }; // std::reference_wrapper<const int>用途
- 集約で、外部に存在するオブジェクトへの参照を複数保持したいとき
- コンテナに参照そのものは入れられないため、その代わりとして使うとき
注意
std::reference_wrapperは所有権を持たない- 参照先オブジェクトの生存期間(C++)は自分で管理する必要がある
- 匿名オブジェクト(一時オブジェクト)を包むと、すぐにダングリング参照になるため使えない