>  기사  >  백엔드 개발  >  C 11 Lambda에서 참조로 참조를 캡처하는 것이 안전합니까?

C 11 Lambda에서 참조로 참조를 캡처하는 것이 안전합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-04 03:50:02273검색

 Is Capturing a Reference by Reference in a C  11 Lambda Safe?

C 11 람다에서 참조로 참조 캡처

C 11에서는 람다를 사용하여 주변 컨텍스트에서 변수를 캡처하는 경우가 많습니다. 하지만 참조로 참조를 캡처하면 어떻게 될까요? 그렇게 해도 안전한가요?

문제 세부 정보

다음 코드를 고려하세요.

<code class="cpp">#include <functional>
#include <iostream>

std::function<void()> make_function(int&amp; x) {
    return [&amp;]{ 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.