람다 표현식에서 고유 포인터 캡처
람다 표현식 내에서 고유 포인터를 캡처하려고 할 때 어려움을 겪는 것이 일반적입니다. 다음 시나리오를 고려하십시오.
std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) { // Caller gives ownership of psomething return [psomething]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
람다가 참조로 고유 포인터를 캡처할 수 없기 때문에 위 코드는 컴파일에 실패합니다. 이 문제를 해결하기 위해 C 14에서는 람다 일반화 캡처를 도입했습니다.
C 14의 Lambda 일반화 캡처
Lambda 일반화 캡처를 사용하면 값 또는 이동을 기준으로 변수를 캡처할 수 있습니다. 이는 아래와 같이 고유 포인터를 캡처할 때 = move() 구문을 활용하여 달성됩니다.
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { // Caller gives ownership of psomething return [auto psomething = std::move(psomething)]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
auto를 사용하면 람다는 고유 포인터인 psomething 유형을 자동으로 추론합니다. = std::move(psomething) 표현식은 고유 포인터의 소유권을 명시적으로 람다 표현식으로 이동합니다.
이동 및 복사 구현
복사 구현 질문에 제공된 이동 기능은 2단계 복사/이동에 유효합니다([이 StackOverflow 질문](https://stackoverflow.com/questions/6322951/whats-the-difference-between-a-copy-에 설명되어 있음) constructor-and-a-move-constructor)).
그러나 C 11에서는 std::move 표현식을 통해 이동 함수에 대해 다른 의미를 도입했다는 점에 유의하는 것이 중요합니다. std::move 표현식은 적용된 개체를 rvalue로 한정하여 기본적으로 개체가 이동되어야 함을 나타냅니다. 따라서 람다 일반화 캡처의 컨텍스트에서는 고유 포인터에 대해 std::move를 명시적으로 호출할 필요가 없습니다. 람다는 필요에 따라 자동으로 소유권을 이동합니다.
위 내용은 C 람다 표현식에서 고유 포인터를 올바르게 캡처하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!