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::refstd::cref

std::reference_wrapperオブジェクトを生成する補助関数。 std::ref は変更可能な参照を、std::crefconst 参照を包みたいときに使う。

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++)は自分で管理する必要がある
  • 匿名オブジェクト(一時オブジェクト)を包むと、すぐにダングリング参照になるため使えない

参考