は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型& &を!
は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型& &を!
なぜ
T
はint&&
に推論しないのですか?
テンプレートパラメータが参照である場合は、控除は(左辺値、機能、および配列に対する推測するとき、例外がフォワーディング参照である)が起こるかを検討する前に、参照は一般的にドロップされます。この場合
、T
はint
ある、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&>
「Tは4に対して演繹される」。むしろ、 'T && 'はrvalue式4と一致します。 'const'は落とされます。私はそれが標準でどのように表現されているかを覚えていませんが、このことはひどく、一見不必要に複雑です。 –
@ Cheersandhth.-Alf 'T &&'は、 'int'型のrvalue式とマッチします。これは、参照を削除し、' int'( 'int &&'型の引数で終わる)に対して 'T' 。もしそれが 'int'型の左辺値だったならば、' int'に対して 'T'を推論します - これは参照型に対して推論する唯一のケースです。 – Barry
を推測する必要がありますか?パラメータのタイプはであり、T
ではありません。したがって:
int &&
です。T &&
です。int &&
のような最も単純なT
は何ですか?回答:int
。
「int &&」に推論しないことをどう知っていますか?私はそれが実際にあると思う。 – Rakete1111
使用法:int && i = 4; func(i);またはfunc(std :: move(i)); – seccpur
@ Rakete1111ここで結論を見ました。http://eli.thegreenplace.net/2014/perfect-forwarding-and-universal-references-in-c/検索「4は値です:Tをintに導き」その点を特定します。 – lsbbo