> 백엔드 개발 > C++ > 본문

C 11 Lambdas에서 참조로 참조를 캡처하면 수정된 값에 대한 액세스가 보장됩니까?

Mary-Kate Olsen
풀어 주다: 2024-11-03 22:39:03
원래의
449명이 탐색했습니다.

Does Capturing a Reference by Reference in C  11 Lambdas Guarantee Access to the Modified Value?

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>
로그인 후 복사

이 프로그램이 정의되지 않은 동작 없이 5를 출력한다고 보장할 수 있습니까? 이 질문은 특히 변수 x를 참조([&])로 캡처할 때 발생하며, make_function 함수가 반환된 후 변수에 대한 참조를 캡처하면 댕글링 참조가 발생하는지 여부와 관련이 있습니다.

대답 :

예, 코드의 작동이 보장됩니다.

설명:

C 11 람다 사양 여기서 캡처된 참조는 원래 참조된 개체가 여전히 존재하는 한 유효하게 유지됩니다. 즉, 함수가 반환된 후 make_function의 매개변수 x가 범위를 벗어나더라도 람다 클로저는 여전히 정수 i에 대한 유효한 참조를 유지합니다.

설명:

이전 응답의 일부 부정확성을 해결하려면:

  • C의 "범위"는 정규화되지 않은 이름 조회가 이름을 선언과 연결하는 정적 어휘 영역을 나타냅니다. 수명과 직접적인 관련은 없습니다.
  • 람다의 "범위 도달" 규칙은 수명이 아닌 구문 규칙에 따라 캡처가 허용되는 시기를 결정합니다.

이 특정 경우에 변수는 x는 람다의 도달 범위 내에 있으며 참조로 캡처됩니다. 따라서 참조는 유효한 상태로 유지되며 람다는 수정된 i 값에 계속 액세스할 수 있습니다.

결론:

이 코드는 참조를 올바르게 캡처하는 방법을 보여줍니다. 람다에서 참조합니다. 정의되지 않은 동작을 호출하지 않고 5를 출력하는 것이 보장됩니다.

위 내용은 C 11 Lambdas에서 참조로 참조를 캡처하면 수정된 값에 대한 액세스가 보장됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿