1

私はT&&クラスでそれを偶然見つけました、そして関数は異なることを意味します。
機能中:

template<class T> void f(T&& t){};   // t is R or L-value
...
int i=0; 
f(i);   // t in f is lvalue
f(42);  // t in f is rvalue  

クラスで:

template<class T> 
struct S { 
       S(T&& t){}  // t is only R-value? 
};
...
int i;
S<int> ss(i);   // compile error - cannot bind lvalue to ‘int&&’

T&& tこれは、クラスにいる場合、t右辺値のみになることを意味しますか?
これについてもっと情報を得ることができる場所を教えてもらえますか?
L値とR値に対して2つのメソッドオーバーロードを作成する必要があるということですか?

答え
Alfの例が示すようにt、関数とクラスはLvalueまたはRvalueになります。

4

2 に答える 2

9

ここでは、テンプレート引数の推論を扱っています。

f テンプレート引数を明示的に定義せずに使用することにより、C++ コンパイラTは、渡されたパラメーターからテンプレート引数の型を決定する必要があります。

型を使用したテンプレート引数推定の規則は&&、完全な転送を可能にするために特別です。を使用するf(i)と、Tと推定されT&ます。したがって、パラメータtのタイプT& &&は で、折りたたむと になりT&ます。ただし、 を使用するf(42)と、タイプTは と推定されるためT&&、に折りたたまれます。tT&& &&T&&

強制 的にT特定のタイプになると、すべてが効果的になくなります。折りたたみは引き続き発生する可能性がありますが、 を使用したためS<int>tタイプは になりますint&&S<int> ss(i)は事実上 と同等ですがf<int>(i)、これも合法ではありません。また、テンプレート引数の推測は型ではなく関数でのみ機能するためS、完全な転送が必要な場合は、次のようにする必要があります。

template<class T> 
struct S { 
    template<class U>
    S(U&& t){}
};

もちろん、SFINAE メソッドとテンプレート メタプログラミングを使用して、 と の基本型がT同じ場合にのみコンストラクター テンプレートをインスタンス化できるようにすることができますU

于 2012-09-07T18:16:39.953 に答える
2

あなたの関数Tでは、実際の引数から推測されます。その特定の組み合わせの主な用途は完全転送です。クラスのテンプレートTは推定されないため、指定する必要があります。

たとえば、これは g++ と msvc の両方で適切にコンパイルされます。

template<class T> 
struct S { 
       S(T&& t){}
};

int main()
{
    int i;
    S< int& > ss(i);
}
于 2012-09-07T18:15:06.967 に答える