2016-10-10 5 views
3

はTが& &をintに推測しませんなぜ私の質問があり、関数テンプレートTがここ&& intに推測しない理由

template <class T> 
void func(T&& t) { 
} 

func(4); // 4 is rvalue and T deduces to int 

のですか?

私はTが& &

をintに演繹場合そう& & & & int型ということを意味 - も私には理にかなっています> int型& &を!

+4

「int &&」に推論しないことをどう知っていますか?私はそれが実際にあると思う。 – Rakete1111

+0

使用法:int && i = 4; func(i);またはfunc(std :: move(i)); – seccpur

+0

@ Rakete1111ここで結論を見ました。http://eli.thegreenplace.net/2014/perfect-forwarding-and-universal-references-in-c/検索「4は値です:Tをintに導き」その点を特定します。 – lsbbo

答えて

7

なぜTint&&に推論しないのですか?

テンプレートパラメータが参照である場合は、控除は(左辺値、機能、および配列に対する推測するとき、例外がフォワーディング参照である)が起こるかを検討する前に、参照は一般的にドロップされます。この場合

Tintある、4に対して推定するので、intとしてT推測されます。結果のタイプT&&int&&です。

式には参照型はありません。 4は、タイプintの値であり、int&&ではありません。

これは控除は、一般的にどのように動作するかと一致している:なぜそれはint&&

template <class T> void foo(T); 
template <class T> void bar(T const&); 

foo(4); // calls foo<int>, not foo<int&&> 
bar(4); // calls bar<int>, not bar<int const&> 
+0

「Tは4に対して演繹される」。むしろ、 'T && 'はrvalue式4と一致します。 'const'は落とされます。私はそれが標準でどのように表現されているかを覚えていませんが、このことはひどく、一見不必要に複雑です。 –

+0

@ Cheersandhth.-Alf 'T &&'は、 'int'型のrvalue式とマッチします。これは、参照を削除し、' int'( 'int &&'型の引数で終わる)に対して 'T' 。もしそれが 'int'型の左辺値だったならば、' int'に対して 'T'を推論します - これは参照型に対して推論する唯一のケースです。 – Barry

7

を推測する必要がありますか?パラメータのタイプはであり、Tではありません。したがって:

  • パラメータの最終的なタイプ(タイプ控除のタイプ)はint &&です。
  • パラメータの正式形式はT &&です。
  • int &&のような最も単純なTは何ですか?

回答:int

関連する問題