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를 참조([&])로 캡처할 때 발생하며, make_function 함수가 반환된 후 변수에 대한 참조를 캡처하면 댕글링 참조가 발생하는지 여부와 관련이 있습니다.
대답 :
예, 코드의 작동이 보장됩니다.
설명:
C 11 람다 사양 여기서 캡처된 참조는 원래 참조된 개체가 여전히 존재하는 한 유효하게 유지됩니다. 즉, 함수가 반환된 후 make_function의 매개변수 x가 범위를 벗어나더라도 람다 클로저는 여전히 정수 i에 대한 유효한 참조를 유지합니다.
설명:
이전 응답의 일부 부정확성을 해결하려면:
이 특정 경우에 변수는 x는 람다의 도달 범위 내에 있으며 참조로 캡처됩니다. 따라서 참조는 유효한 상태로 유지되며 람다는 수정된 i 값에 계속 액세스할 수 있습니다.
결론:
이 코드는 참조를 올바르게 캡처하는 방법을 보여줍니다. 람다에서 참조합니다. 정의되지 않은 동작을 호출하지 않고 5를 출력하는 것이 보장됩니다.
위 내용은 C 11 Lambdas에서 참조로 참조를 캡처하면 수정된 값에 대한 액세스가 보장됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!