C 14는 일반화된 람다 캡처를 도입하여 이동 캡처를 가능하게 합니다. C 14에서는 다음과 같은 코드가 유효합니다.
auto u = make_unique<some_type>( some, parameters ); // move the unique_ptr into the lambda go.run( [ u = move(u) ] { do_something_with( u ); } );
객체를 람다에서 다른 함수로 이동해야 하는 경우 람다는 변경 가능으로 표시되어야 합니다.
go.run( [ u = move(u) ] mutable { do_something_with( std::move(u) ); } );
C 11에서는 도우미 기능을 사용하여 이동 캡처를 수행할 수 있습니다. 원하는 값에 대한 rvalue 참조를 생성하는 make_rref:
#include <cassert> #include <memory> #include <utility> template <typename T> struct rref_impl { rref_impl() = delete; rref_impl( T && x ) : x{std::move(x)} {} // ... implementation }; template<typename T> rref_impl<T> make_rref( T && x ) { return rref_impl<T>{ std::move(x) }; }
make_rref 함수를 사용하여 람다의 값을 캡처합니다.
int main() { std::unique_ptr<int> p{new int(0)}; auto rref = make_rref( std::move(p) ); auto lambda = [rref]() mutable -> std::unique_ptr<int> { return rref.move(); }; assert( lambda() ); assert( !lambda() ); }
이 해결 방법을 사용하면 람다를 복사할 수 있게 됩니다. 복사할 수 없는 객체를 캡처할 때 문제가 발생할 수 있습니다.
일반화된 람다 캡처를 에뮬레이션하는 또 다른 접근 방식은 캡처 기능을 정의하는 것입니다.
#include <utility> template <typename T, typename F> class capture_impl { T x; F f; public: // ... 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) ); }
캡처를 사용하여 이동으로 값을 캡처합니다.
int main() { std::unique_ptr<int> p{new int(0)}; auto lambda = capture( std::move(p), []( std::unique_ptr<int> & p ) { return std::move(p); } ); assert( lambda() ); assert( !lambda() ); }
이 솔루션은 다음을 제공합니다. 캡처된 유형을 복사할 수 없는 경우 람다 복사를 비활성화하는 보다 깔끔한 접근 방식입니다.
위 내용은 C Lambda(C 11 및 C 14)에서 이동 캡처를 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!