完全転送
引数が一時オブジェクトだったかどうかの情報を失わずに、別の関数へ渡すこと。make_uniqueやemplace_backを書けるようにしている仕組みだ。
引数を普通の参照で受けるラッパーは、値カテゴリの情報を失う。関数の内側ではすべてが名前付きのオブジェクトに見えるため、本来ムーブされるべき一時オブジェクトがコピーされてしまう。解決策はtemplate<class... A> void f(A&&... a) { g(std::forward<A>(a)...); }というパターンである。ここでの&&は右辺値参照ではなく、型が推論されるので転送参照(forwarding reference)になる。参照畳み込みの規則により、一時オブジェクトにも名前付きオブジェクトにも束縛でき、その区別は推論された型に保たれる。そしてstd::forwardが、元のカテゴリを復元する条件付きキャストとして働く。これを省くと、パターンは意味をなさない。