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>
이 코드는 정의되지 않은 동작을 호출하지 않고 5를 출력하도록 보장됩니까?
이 코드는 실제로 정의되지 않은 동작을 호출하지 않고도 작동이 보장됩니다. 값 기준 캡처([= x])와 달리 참조 기준 캡처([&x])는 참조가 수명이 지나도 지속될 수 있도록 허용하는 C 표준 내 고유 예외를 활용합니다. 이는 람다 표현식으로 캡처된 참조가 람다 클로저 유형에 대한 멤버 액세스로 구현되기 때문입니다.
범위 및 수명 고려 사항
범위 도달 규칙에 유의하는 것이 중요합니다. 람다는 순전히 구문적이므로 이 시나리오에서는 역할을 수행하지 않습니다. 참조된 엔터티 x는 람다의 도달 범위 내에 있으며 캡처할 수 있습니다.
표준 표현
[expr.prim.lambda]/17에 따르면 C 표준에서는 복사로 캡처된 표현식만 람다 클로저 유형의 멤버 액세스로 변환됩니다. 참조로 캡처된 표현식은 수정되지 않은 채로 그대로 유지되며 원래 엔터티를 계속 나타냅니다.
또한 표준은 참조가 수명 기간 외에 사용되는 문제를 명시적으로 다루지 않습니다. 그러나 (자체 초기화 프로그램이나 이전 클래스 멤버에서 참조하지 않는 한) 참조를 수명 기간 외에 사용해도 불이익이 없으므로 이 코드는 의도한 대로 작동할 수 있습니다.
결론
C 11 람다에서 참조로 참조를 캡처하면 예상대로 작동하여 정의되지 않은 동작을 호출하지 않고 참조된 정수의 업데이트된 값을 출력합니다. 이는 람다 캡처에 대한 표준 정의와 특정 특정 컨텍스트 내에서 참조 수명을 초과하여 참조를 사용하는 경우 처벌이 없다는 사실에 근거합니다.
위 내용은 C 11 람다에서 참조로 참조를 캡처하면 업데이트된 값 출력이 보장됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!