20

右辺値参照の簡単な紹介ではforward、次のように定義されています。

  template <typename T>
  struct identity { typedef T type; };

  template <typename T>
  T &&forward(typename identity<T>::type &&a) { return a; }

identityクラスはどのような目的を果たしますか?なぜだめですか:

  template <typename T>
  T &&forward(T &&a) { return a; }
4

1 に答える 1

18

の目的は、推論できない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

于 2011-04-01T12:56:58.420 に答える