답변:
캡처 목록에 명시 적으로 이름이 지정된 각 변수가 캡처됩니다. 기본 캡처는 (a) 캡처 목록에 명시 적으로 이름이 지정되지 않은 변수와 (b) 람다 식의 본문에 사용되는 변수 만 캡처합니다 . 변수의 이름이 명시 적으로 지정되지 않았고 람다 식에서 변수를 사용하지 않으면 변수가 캡처되지 않습니다. 귀하의 예에서는 my_huge_vector캡처되지 않습니다.
C ++ 11 §5.1.2 [expr.prim.lambda] / 11 기준 :
경우 람다 표현이 연관된있다 캡처 기본 및 그 화합물 문 ODR-사용
this또는 자동 저장 기간과의 변수 ODR 사용되는 개체를 명시 적으로 포착되지 않습니다, 다음 ODR 사용되는 개체는 암시 적으로 캡처 할 수 있다고합니다.
람다 식에는 연결된 캡처 기본값이 있습니다. 기본적으로 [=].
변수가 사용되는 경우에만 ( "사용"이라는 용어의 단일 정의 규칙 의미에서) 변수가 암시 적으로 캡처됩니다. my_huge_vector람다 식의 본문 ( "복합 문")에서 전혀 사용하지 않기 때문에 암시 적으로 캡처되지 않습니다.
§5.1.2 / 14를 계속하려면
엔티티는 다음과 같은 경우 사본으로 캡처됩니다.
- 그것은 암시 적으로 포착하고있다 캡처 - 기본 인
=경우 또는- 포함되지 않은 캡처로 명시 적으로 캡처됩니다
&.
당신 때문에 my_huge_vectorIS 암시 캡처되지 및 명시 적으로 포착되지 않는, 그것은 사본 또는 참조를 기준으로, 전혀 포착되지 않는다.
아니요, my_huge_vector캡처되지 않습니다. 사용 된 [=]모든 변수가 람다에 캡처 됨을 의미합니다 .
void f() { const int size(10); [] { int x[size]; }; }. 여기서는 size캡처되지 않지만 ODR 의미에서 사용되지 않기 때문에 괜찮습니다. (Visual C ++ 2010은 VC10이 출시 된 후 사양이 변경되었거나 버그로 인해이 코드를 허용하지 않습니다. 아마도이 코드는 향후 버전에서 수정 될 것입니다. g ++ 4.5.1에서 허용합니다.)
const물건이 잠재적으로 변형되지 않는다고 가정하는지 잘 모르겠습니다 . 매우 공격적인 최적화 플래그 OX 같은 것이 아니라면.