2012-08-26 3 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);T는 람다 test(t1)를 호출 할 때 int& 그렇게 t1int&해야합니다. 왜 출력이 아닌 람다는 test()에 전달 t1의 로컬 복사본을 획득, 그래서 캡처 별 값 [=]을 통해

2 
3 
3 

답변

7

T는 & 그래서 T1이 &

참조 포인터하지 INT해야 INT이다. T 따라서 t1가 기준이다 int&으로 추론 될 수있다. 하지만 당신은 에 의해 t1을 캡처하는 람다를 물었다. 즉, t1에 의해 참조를 복사하는 것을 의미한다.

t1이 포인터 인 경우 값으로 포인터를 얻습니다. 그러나 당신은 "가치에 의한"참조를 얻을 수 없습니다. 참조되는 값만 가져올 수 있습니다.

+0

나는 람다에서 테스트합니다. [=() {가변 mytesttypecode (decltype (T1)); 복귀 시험 (T1)}(); t1은 int &이다. 내가 생각하기에 좋지 않은 무언가 ..... – user1625647

2

원래 t 객체에 영향을 미치지 않을 것 람다에 t1에 무슨 일이 생기면.

관련 문제