소개
C에서는 rvalue 참조라고도 알려진 이동 캡처를 사용하여 개체의 소유권을 람다 식으로 효율적으로 이전합니다. 이 기술은 객체의 리소스를 람다 내에서 명시적으로 관리해야 하는 상황에서 특히 유용할 수 있습니다.
C 14에서 일반화된 람다 캡처는 우아한 솔루션을 제공합니다. 이동 캡처용. 이 기능을 사용하면 이동 의미 체계를 사용하여 값별로 변수를 캡처하는 람다 식을 선언할 수 있습니다.
using namespace std; auto u = make_unique<some_type>(some, parameters); go.run([u = move(u)] { do_something_with(u); });
이 접근 방식은 u의 소유권을 람다로 이동하여 리소스가 적절하게 해제되도록 합니다. 또한 개체를 람다 밖으로 이동해야 하는 경우 람다는 변경 가능으로 선언되어야 합니다.
C 11에서는 이동 캡처가 직접적으로 수행되지 않습니다. 지원됩니다. 그러나 이 동작을 에뮬레이트할 수 있는 기술이 있습니다. 한 가지 접근 방식은 도우미 함수를 사용하여 rvalue 참조(rref)를 만드는 것입니다.
template <typename T> struct rref_impl { rref_impl() = delete; rref_impl(T &&x) : x(std::move(x)) {} // ... (remaining implementation) }; template<typename T> rref_impl<T> make_rref(T &&x) { return rref_impl<T>{std::move(x)}; }
이 도우미 함수를 사용하면 람다에서 이동하여 개체를 캡처할 수 있습니다.
unique_ptr<int> p{new int(0)}; auto rref = make_rref(std::move(p)); auto lambda = [rref]() mutable -> unique_ptr<int> { return rref.move(); };
캡처된 rvalue 참조를 수정할 수 있도록 람다는 변경 가능하도록 선언되었습니다.
C 11에서 일반화된 람다 캡처를 에뮬레이트하는 또 다른 접근 방식은 사용자 정의 클래스를 사용하여 변수를 캡처하고 이를 람다 밖으로 이동하는 방법을 제공하는 것입니다.
template <typename T, typename F> struct capture_impl { T x; F f; // ... (remaining implementation) }; template <typename T, typename F> capture_impl<T,F> capture(T &&x, F &&f) { return capture_impl<T,F>(std::forward<T>(x), std::forward<F>(f)); }
이 클래스는 이동으로 변수를 캡처하고 람다를 호출하는 방법을 제공하는 데 사용할 수 있습니다.
unique_ptr<int> p{new int(0)}; auto lambda = capture(std::move(p), [](unique_ptr<int> &p) { return std::move(p); });
이전 클래스와 달리 접근 방식에서는 캡처된 유형이 복사 가능하지 않은 경우 이 람다를 복사할 수 없습니다. 이렇게 하면 람다 복사 시 발생할 수 있는 오류를 방지할 수 있습니다.
위 내용은 C 람다 표현식에서 이동을 통해 객체를 효율적으로 캡처하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!