例として
template <typename T>
void function(T&& arg)
誰かが、関数のシグネチャが左辺値の場合はT&になり、渡された右辺値の場合はT &&になる方法を詳しく説明できますか?どういうわけか(標準線が必要)左辺値の場合はT-> T&、再値の場合はT-> Tであり、&と&&を組み合わせることで左辺値/右辺値の参照が得られることを知っています。
ルールはセクション8.3.2p6にあります。
typedef、type template-parameter、またはdecltype-specifier
TR
が型 への参照である型を示すT
場合、型 "lvalue reference to cvTR
"を作成T
しようとすると、型 "lvaluereferenceto"が作成されます。タイプ「rvaluereferencetocv」を作成すると、タイプが作成されます 。TR
TR
または表形式で:
TR R
T& & -> T& // lvalue reference to cv TR -> lvalue reference to T
T& && -> T& // rvalue reference to cv TR -> TR (lvalue reference to T)
T&& & -> T& // lvalue reference to cv TR -> lvalue reference to T
T&& && -> T&& // rvalue reference to cv TR -> TR (rvalue reference to T)
これは、参照折りたたみルールのおかげです。U
それが非参照型であると仮定します。それから:
T = U T & = U & T && = U &&
If T = U & , then T & = U & and T && = U & .
T = U && T & = U & T && = U &&
したがって、関数の引数が型の左辺値参照にバインドできる場合は、U
になるためにT
と推定する必要があります。左辺値は右辺値参照にバインドできないため、これが唯一の選択肢です。一方、引数が型の右辺値である場合は、と推定され、引数をバインドできます。U &
T &&
U &
U
T
U
T &&
U &&
重要な点は、一致する参照型はT &&
(T
!ではなく)であるということです。ただし、それarg
自体は名前付き変数であり、したがって左辺値であるため、関数が呼び出されたときと同じ式std::forward<T>(arg)
を作成するために使用する必要があります。