2012-08-26 20 views
5

kullanımıC++ 11 lambda yakalama listesi [=], bir şablon işlevi bir referans referans

template<class T> 
void test(T&&i) 
{ 
    ++i; 
    std::cout << i << std::endl; 
} 

template<class T> 
void typetest(T&& t) 
{ 
    ++t; 
    T t1(t); 
    [=]() mutable { std::cout << t1 << std::endl; return test(t1); }(); 
    std::cout << t << std::endl; 
} 

int main() 
{ 
    int i=1; 
    typetest(i); 
} 

bu

2 
3 
2 

Ancak içinde yazdırır T, test(t1) numaralı telefondan olmalıdır. Neden çıkış sağlamak değildir lambda o test() geçer t1 yerel bir kopyasını elde eder, bu nedenle yakalama değer-ile-[=] sayesinde

2 
3 
3 

cevap

7

T & böylece t1 &

Kaynaklar gösterici değildir int olmalıdır int. T, int& olarak çıkarılabilir, dolayısıyla t1 bir referanstır. Ancak, lambda'nın t1'u değerini yakalamasını istediniz. Bu, t1 tarafından atıfta bulunulan değerini kopyalamak anlamına gelir.

t1 işaretçiyse, işaretçiyi değere göre alırsınız. Ama "değer ile" bir referans elde edemezsiniz; sadece referans verilen değeri alabilirsiniz.

+0

Lambda test ediyorum. [=]() mutable {mytesttypecode (decltype (t1)); dönüş testi (t1);}(); ve t1 int &. iyi bir şey sanmıyorum ..... – user1625647

2

orijinal t nesneyi hiçbir zaman etkilemez lambda t1 ne olursa olsun.

İlgili konular