"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C ++ 11 Lambda는 참조를 캡처하지 않습니까?

C ++ 11 Lambda는 참조를 캡처하지 않습니까?

2025-04-30에 게시되었습니다
검색:849

Can C  11 Lambdas Capture References Without Invoking Undefined Behavior?

#include #include std :: function make_function (int & x) { return [&] {std :: cout

이 코드는 [&] 구문을 사용하여 기준으로 변수 x를 캡처합니다. 이 프로그램이 정의되지 않은 동작을 호출하지 않고 5 출력을 보장하는지 여부는 문제가 발생합니다.

#include 
#include 

std::function make_function(int& x) {
    return [&]{ std::cout  

코드는 올바르게 작동합니다. 기본 표준 문구를 조사하기 전에이 코드는 C위원회가 의도 한대로 기능한다는 점에 유의해야합니다. 그러나 C 11 표준의 초기 문구는이 문제에 대해 불분명했으며, CWG 문제 2011이 설명을 제공하기 위해 제기되었습니다. 이 문제는 C 표준의 진행중인 개발에서 해결되고있다.

표준 설명

/17은 사본이 캡처 한 Entities 만 참조하는 ID- 표현은 Lambda 유형의 회원 액세스로 변환됩니다. 참조로 캡처 된 엔티티를 언급하는 ID- 표현은 혼자 남겨져 있으며 동일한 엔티티를 계속 유지하는 범위로 표시합니다.

위 코드에서 캡처 된 엔티티는 Lambda의 범위에 도달하는 Make_function 함수의 매개 변수 X입니다. 따라서 Lambda 표현식의 기준 X는 기본 함수에서 선언 된 원래 변수를 나타냅니다. 그러나 평생 밖에서 참조를 참조 할 수있는 시나리오가 제한되어 있습니다. 일반적으로, 참조는 범위로 선언되거나 클래스 멤버이며,이 경우 클래스 자체는 수명 내에 있어야합니다.

Can C  11 Lambdas Capture References Without Invoking Undefined Behavior? 
따라서 표준은 평생 밖에서 참조의 사용을 명시 적으로 금지하지 않습니다. 이 허점은 Lambda 표현식에서 참조로 참조를 캡처 할 수 있도록 허용했습니다.

CWG 문제 2012 및 향후 설명

CWG 문제 2012는 특정 상황에서 언급이 평생 밖에서 언급 될 수 있다는 감독을 해결하기 위해 제기되었습니다. 이 문제의 해결은 실수로 참조를 참조하여 Lambda 캡처의 사양에 영향을 미쳤습니다. 그러나이 회귀 분석은 C 17이 릴리스되기 전에 수정 될 것으로 예상됩니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3