C 11 람다에서 참조로 참조 캡처
C 11에서는 람다를 사용하여 주변 컨텍스트에서 변수를 캡처하는 경우가 많습니다. 하지만 참조로 참조를 캡처하면 어떻게 될까요? 그렇게 해도 안전한가요?
문제 세부 정보
다음 코드를 고려하세요.
<code class="cpp">#include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ std::cout << x << std::endl; }; } int main() { int i = 3; auto f = make_function(i); i = 5; f(); }</code>
이 코드에는 다음과 같은 람다가 있습니다. 정수 변수 i에 대한 참조를 캡처합니다. 그런 다음 주 함수에서 i를 수정하고 람다를 호출합니다. 문제는 람다가 3을 출력할 것인가 아니면 5를 출력할 것인가입니다.
표준 기반 답변
코드는 정의되지 않은 동작을 호출하지 않고 5를 출력하도록 보장합니다.
설명
C 11 표준([expr.prim.lambda]/17)에 따르면 복사본으로 캡처된 엔터티를 참조하는 id-expression만 멤버 액세스로 변환됩니다. 람다 폐쇄 유형에 대해. 참조로 캡처된 엔터티를 참조하는 ID 표현식은 단독으로 남아 있으며 여전히 둘러싸는 범위에서 표시했을 것과 동일한 엔터티를 나타냅니다.
이는 람다의 참조 x가 변경되지 않음을 의미합니다. 이는 여전히 주 함수에서 동일한 정수 변수 i를 참조합니다. 따라서 주 함수에서 i를 수정하면 람다에는 수정된 값이 계속 표시됩니다.
위 내용은 C 11 Lambda에서 참조로 참조를 캡처하는 것이 안전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!