2012-08-26 60 views
5

當我捕獲一個值,但該值的類型是在模板函數的引用C++ 11拉姆達捕獲列表[=]使用參考

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); 
} 

它打印

2 
3 
2 

但在T t1(t);Tint&所以t1應該是int&當lambda調用​​時。爲什麼不輸出

2 
3 
3 

回答

7

T是INT &所以T1應該是int &

引用不是指針。 T可能推導爲int&,因此t1是一個參考。但是你要求lambda捕獲t1。這意味着複製t1引用的

如果t1是一個指針,你會得到值的指針。但是你不能通過「價值」得到一個參考。你只能得到被引用的值。

+0

我在lambda中測試。 [=]()mutable {mytesttypecode(decltype(t1)); return test(t1);}();並且t1是int&。我認爲沒有好的東西..... – user1625647

2

通過捕獲由價值[=]您的拉姆達獲得的t1本地副本,它傳遞給test(),所以無論發生什麼事,以t1在lambda絕不會影響原來的t對象。