11

なぜこれがコンパイルされ、なぜttype で終わるのか、誰でも説明できますint&か?

#include <utility>

void f(int& r)
{
    ++r;
}

template <typename Fun, typename T>
void g(Fun fun, T&& t) 
{ 
    fun(std::forward<T>(t)); 
}

int main()
{
    int i = 0;

    g(f, i);
}

これは GCC 4.5.0 20100604 および GDB 7.2-60.2 で見られます

4

2 に答える 2

17

完全な転送のため、 への引数P&&が左辺値の場合、Pは引数の型に加えて が付加されていると推定されます&。だからあなたはいるint & &&と得ます。引数が右辺値の場合は、引数の型のみに推定されるため、たとえば直接渡す場合は、引数を取得します。Pint&Pint&&Pint0

int& &&に折りたたまれint&ます (これはセマンティック ビューです - 構文的int& &&には違法です。しかし、 がテンプレート パラメーターまたは型を参照する typedef であるU &&場合は、依然として型です。つまり、2 つの参照が 1 つの左辺値参照に「折りたたまれます」)。そのため、 type があります。Uint&U&&int&tint&

于 2010-12-01T18:34:51.467 に答える
3

何らかの理由で、特に左辺値または右辺値にバインドしたい場合は、メタプログラミングを使用します。

#include <type_traits>

template <typename T>
typename std::enable_if<std::is_lvalue_reference<T&&>::value, void>::type
fun(T&& x)
{
    std::cout << "lvalue argument\n";
}

template <typename T>
typename std::enable_if<std::is_rvalue_reference<T&&>::value, void>::type
fun(T&& x)
{
    std::cout << "rvalue argument\n";
}

int main()
{
    int i = 42;
    fun(i);
    fun(42);
}
于 2010-12-01T21:57:00.227 に答える