업데이트 : 하단 인용문에서 Core 의자가 약속 한대로 코드는 이제 잘못된 형식입니다 .
단순 캡처 의 식별자 가 lambda-declarator 의 parameter-declaration-clause 매개 변수의 declarator-id 로 나타나면 프로그램의 형식이 잘못된 것입니다.
얼마 전에 람다에서 이름 조회와 관련된 몇 가지 문제가있었습니다. N2927에 의해 해결되었습니다 .
새로운 문구는 더 이상 캡처 된 엔티티의 사용을 다시 매핑하기 위해 조회에 의존하지 않습니다. 람다의 복합 문 이 두 번의 패스로 처리되거나 해당 복합 문의 이름 이 클로저 유형의 멤버로 해석 될 수 있다는 해석을 더 명확하게 거부합니다 .
조회는 항상 lambda-expression 의 컨텍스트에서 수행되며 클로저 유형의 멤버 함수 본문으로의 변환 "이후"가 아닙니다. [expr.prim.lambda] / 8 참조 :
람다 식 의 화합물 문 수율 함수 바디 함수 호출 연산자 ([dcl.fct.def])로하지만, 이름 조회를 위하여, [...] 상기 화합물 문 의 맥락에서 고려 람다 표현 . [ 예 :
struct S1 {
int x, y;
int operator()(int);
void f() {
[=]()->int {
return operator()(this->x+y); // equivalent to: S1::operator()(this->x+(*this).y)
// and this has type S1*
};
}
};
— 최종 예 ]
(이 예는 또한 조회가 클로저 유형의 생성 된 캡처 멤버를 어떻게 든 고려하지 않음을 분명히합니다.)
이름 foo
은 캡처에서 (재) 선언되지 않습니다. 람다 식을 둘러싸는 블록에서 선언됩니다. 매개 변수 foo
는 해당 외부 블록에 중첩 된 블록에서 선언됩니다 ( 람다 매개 변수도 명시 적으로 언급하는 [basic.scope.block] / 2 ). 조회 순서는 내부 블록에서 외부 블록으로 명확 합니다. 입니다. 따라서 매개 변수를 선택해야합니다. 즉, Clang이 맞습니다.
캡처를 init-capture, 즉 foo = ""
대신 으로 만들면 foo
대답이 명확하지 않습니다. 이것은 지금 캡처가 실제로 "블록"이 제공되지 않은 선언을 유도 입니다. 나는 이것에 대해 핵심 의장에게 메시지를 보냈다.
이 문제는 2211 호입니다 (불행하게도 여러 문제에 대한 자리 표시 자만있는 상태로 곧 open-std.org 사이트에 새로운 문제 목록이 표시됩니다.이 중 하나입니다. 저는 Kona 이전에 이러한 공백을 채우기 위해 열심히 노력하고 있습니다. 월말 회의). CWG는 1 월 원격 회의에서이 문제를 논의했으며 , 캡처 이름이 매개 변수 이름 인 경우 프로그램을 잘못 구성하는 것이 방향입니다.