これだけで私たちは、テンプレート型推論から、一般的に期待するものとラインアップ:
template <class T> void vfoo(T);
template <class T> void lfoo(T&);
template <class T> void cfoo(T const&);
template <class T> void ffoo(T&&);
std::string x;
vfoo(x); // deduce T = std::string
lfoo(x); // deduce T = std::string
cfoo(x); // deduce T = std::string
ffoo(x); // deduce T = std::string& !
ffoo(std::move(x)); // deduce T = std::string
the original paperから、重点鉱山:
に一致する左辺値引数を使用して、関数テンプレートの種類を推定rvalue参照である場合、その型はlvalue参照型として推定されます。控除に右辺の引数が与えられると、型減算が他の型と同様に進められます。
これは、左辺の控除のケースです。これは例外的なケースです。これは、タイプ控除ルールで余分な文章が得られる理由です。右辺のケースは典型的なもので、演繹された型に貼り付ける単純な精神モデルと整列して、どのような関数が最終的に終わるかを調べます。 T&&
といい、std::string
と表示されていますか? T = std::string
を取得し、引数がstd::string&&
となるようにします。チェック。
最後の文章が間違っています。 'template void foo(T)'は参照型を推論しません。 –
Oktalist
@Oktalistあなたが正しいです - 私はそれを削除しました。 – Pete