の目的は、推論できないidentity
ようにすることT
でした。つまり、をT
呼び出すときにクライアントに明示的に指定するように強制しますforward
。
forward(a); // compile-time error
forward<A>(a); // ok
これが必要な理由は、テンプレートパラメータが、引数を左辺値または右辺値として転送するようにクライアントがコンパイラに指示するスイッチであるためです。誤ってこの情報を指定し忘れた場合、左辺値は常に左辺値として返され、右辺値は常に右辺値として返されます。最初はあなたが望むように聞こえるかもしれませんが、実際にはそうではありません。
template <class T, class A1>
std::shared_ptr<T>
factory(A1&& a1)
{
return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
}
上記の例a1
では、常に左辺値です。ただし、「スイッチ」A1
は左辺値の参照である場合とそうでない場合があります。左辺値参照の場合は左辺a1
値として返され、そうでない場合a1
は右辺値として返されます。工場の作者が誤ってA1を提供するのを忘れた場合、の使用はidentity
コンパイル時に彼に思い出させます。
注:最終ドラフトにはが欠けていますが、同じ場所で同じ目的でidentity
使用されます。remove_reference