>

다음 코드는 컴파일되지 않습니다. pt 이기 때문에   const std::packaged_task<void()>> 의 유형이 있습니다  그리고 operator()   const 가 아닙니다 .

auto packagedTask = std::packaged_task<void()>>([]{});
auto future = packagedTask.get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });

해결 방법은 다음과 같습니다.

auto packagedTask = std::make_shared<std::packaged_task<void()>>([]{});
auto future = packagedTask->get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });

람다 객체의 지역 변수가 const 인 이유 ? 해결 방법에 대한 오버 헤드없이 첫 번째 코드가 작동하도록하고 싶습니다. 문제를 해결하는 가장 좋은 방법은 무엇입니까?


  • 답변 # 1

    람다는 mutable 로 표시되지 않는 한 생성 된 lambda::operator()   const 자격이됩니다 . 람다를 mutable 로 표시  이 동작을 방지합니다 :

    auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); });
    
    
    <시간> 와이즈 비즈 와이즈 비즈 ?

    람다 식으로 생성 된클로저의 로컬 변수는

    Why local variables in the lambda object are 가 아닙니다. . 생성 된 const 입니다  그것은 const 자격이 있습니다 . 더 좋은 질문은"왜 람다의 lambda::operator() 입니까?  암시 적으로 const ?

    operator() 때문이야   const 보다 더 나은 기본값입니다 . 변경 가능성은 복잡성을 초래합니다. 불변성으로 인해 코드를 쉽게 추론 할 수 있습니다.

    const  언어 전체의 기본값이어야하지만 역 호환성으로 인해 변경할 수 없습니다. 람다는 새로운 기능 이었기 때문에,위원회는 mutable 와 함께 가기로 결정  기본 설정 및 옵트 인 변경 가능성.

    const

관련 자료

  • 이전 java - android studio에서 다음 페이지의 이미지 뷰에 여러 버튼 연결
  • 다음 macos - 코코아 앱용 프레임 워크 번들의 심볼릭 링크 문제