> 백엔드 개발 > C++ > C 람다 표현식에서 고유 포인터를 올바르게 캡처하려면 어떻게 해야 합니까?

C 람다 표현식에서 고유 포인터를 올바르게 캡처하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2024-11-21 05:23:10
원래의
606명이 탐색했습니다.

How Can I Correctly Capture Unique Pointers in C   Lambda Expressions?

람다 표현식에서 고유 포인터 캡처

람다 표현식 내에서 고유 포인터를 캡처하려고 할 때 어려움을 겪는 것이 일반적입니다. 다음 시나리오를 고려하십시오.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿