>백엔드 개발 >C++ >이동 캡처 람다 표현식에서 `std::function`을 생성할 수 있나요?

이동 캡처 람다 표현식에서 `std::function`을 생성할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-11 13:46:11974검색

Can I Create an `std::function` from a Move-Capturing Lambda Expression?

이동 캡처 람다 표현식에서 std::function 생성

이동 캡처 람다 표현식에서 std::function을 생성할 수 있습니다. 그러나 특정 제한 사항이 적용됩니다.

템플릿 생성자

다음 템플릿 생성자를 사용하여 이동 캡처 람다에서 std::function을 생성할 수 있습니다.

template<class F>
function(F f);

요구사항

이 생성자가 작동하려면 다음 요구 사항이 충족되어야 합니다.

  • 람다 식의 캡처는 복사 생성 가능해야 합니다.
  • 람다 식은 지정된 인수 유형으로 호출 가능해야 하며 반환을 반환해야 합니다. type.
  • 람다 캡처의 복사 생성자와 소멸자는 throw되면 안 됩니다. 예외.

이동 전용 유형

이동하는 람다에서 std::function을 구성하는 것은 없습니다 이동 전용 유형을 캡처합니다. 이는 std::function의 복사 생성자와 대입 연산자가 복사 생성 가능한 유형이 필요한 생성자의 관점에서 정의되었기 때문입니다.

다음 코드 조각을 고려하세요. :

auto pi = std::make_unique<int>(0);

// Move-capturing lambda
auto foo = [q = std::move(pi)] {
    *q = 5;
    std::cout << *q << std::endl;
};

이 람다에서 std::function을 생성하려고 시도하는 중 다음 접근 방식 중 하나를 사용하면 컴파일 오류가 발생합니다.

std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);

이는 pi가 이동 전용 유형이고 std::function의 복사 생성자에 복사 생성 가능한 유형이 필요하기 때문입니다.

따라서 std::function과 함께 이동 캡처 람다를 사용하려면 해당 캡처가 복사 구성 가능한지 확인하세요.

위 내용은 이동 캡처 람다 표현식에서 `std::function`을 생성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.