2

例として

template <typename T>
void function(T&& arg)

誰かが、関数のシグネチャが左辺値の場合はT&になり、渡された右辺値の場合はT &&になる方法を詳しく説明できますか?どういうわけか(標準線が必要)左辺値の場合はT-> T&、再値の場合はT-> Tであり、&と&&を組み合わせることで左辺値/右辺値の参照が得られることを知っています。

4

2 に答える 2

5

ルールはセクション8.3.2p6にあります。

typedef、type template-parameter、またはdecltype-specifierTRが型 への参照である型を示すT場合、型 "lvalue reference to cv TR "を作成Tしようとすると、型 "lvaluereferenceto"が作成されます。タイプ「rvaluereferencetocv」を作成すると、タイプが作成されますTRTR

または表形式で:

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)
于 2012-10-23T14:29:21.457 に答える
4

これは、参照折りたたみルールのおかげです。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 &UTUT &&U &&

重要な点は、一致する参照型はT &&T!ではなく)であるということです。ただし、それarg自体は名前付き変数であり、したがって左辺値であるため、関数が呼び出されたときと同じstd::forward<T>(arg)を作成するために使用する必要があります。

于 2012-10-23T14:36:31.797 に答える