Programming

c ++ 11 람다는 사용하지 않는 변수를 캡처합니까?

procodes 2020. 7. 17. 22:09
반응형

c ++ 11 람다는 사용하지 않는 변수를 캡처합니까?


내가 사용하는 경우 [=]나, 람다의 값으로 캡처 할 모든 지역 변수를 원하는에서 그 결과 것을 나타 내기 위해 모든 함수에서 지역 변수 복사, 아니면 그냥 모든 지역 변수되는 람다 사용하는 ?

예를 들어 내가 가지고있는 경우 :

vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });

my_huge_vector는 람다에서 사용하지 않더라도 복사됩니까?


캡처 목록에 명시 적으로 명명 된 각 변수가 캡처됩니다. 기본 캡처는 (a) 캡처 목록에 명시 적으로 명명되지 않은 변수와 (b) 람다 식 본문에 사용변수 만 캡처합니다 . 변수의 이름이 명시 적으로 지정되지 않고 람다 식에서 변수를 사용하지 않으면 변수가 캡처되지 않습니다. 귀하의 예에서는 my_huge_vector캡처되지 않습니다.

C ++ 11 §5.1.2 [expr.prim.lambda] / 11에 따라 :

경우 람다 표현이 연관된있다 캡처 기본 및 그 화합물 문 ODR-사용 this 또는 자동 저장 기간과의 변수 ODR 사용되는 개체를 명시 적으로 포착되지 않습니다, 다음 ODR 사용되는 개체는 암시 적으로 캡처 할 수 있다고합니다.

람다 식에는 관련 캡처 기본값이 있습니다. 기본적으로을 사용하여 값으로 변수를 캡처합니다 [=].

변수가 사용 된 경우 ( "사용 된"이라는 용어의 하나의 정의 규칙 의미에서) 암시 적으로 캡처 된 변수입니다. my_huge_vector람다 식의 본문 ( "compound statement")에서 전혀 사용하지 않기 때문에 암시 적으로 캡처되지 않습니다.

§5.1.2 / 14를 계속하려면

엔티티는 다음과 같은 경우 사본으로 캡처됩니다.

  • 암시 적으로 캡처되며 캡처 기본값=또는
  • 이 포함되지 않은 캡처로 명시 적으로 캡처됩니다 &.

당신 때문에 my_huge_vectorIS 암시 캡처되지 및 명시 적으로 포착되지 않는, 그것은 사본 또는 참조를 기준으로, 전혀 포착되지 않는다.


아니요, my_huge_vector캡처되지 않습니다. 사용[=]모든 변수가 람다에서 캡처 됨을 의미합니다 .

참고 URL : https://stackoverflow.com/questions/6181464/do-c11-lambdas-capture-variables-they-dont-use

반응형