2014-10-23 5 views
1

와 표준 : : 바인드를 사용 할 수 없습니다 :내가 사용하는 경우 표준 : 약속

int a = 3; 
std::function<void()> task1 = std::bind([](int a){}, std::move(a)); 

괜찮아,하지만 난 std::promise<int>int를 교체하는 경우 :

std::promise<int> p; 
std::function<void()> task2 = std::bind([](std::promise<int> p){}, std::move(p)); 

G는 ++에서 오류가 발생합니다 :

error: conversion from ‘std::_Bind_helper<false, main()::__lambda7, std::promise<int> >::type {aka std::_Bind<main()::__lambda7(std::promise<int>)>}’ to non-scalar type ‘std::function<void()>’ requested 
std::function<void()> task2 = std::bind([](std::promise<int> p){}, std::move(p)); 

왜? std::promise 매개 변수를 바인딩 할 때의 문제점은 무엇입니까?

답변

5

std::function의 경우 내부 유형을 복사 할 수 있어야합니다. 이 속성은 첫 번째 예제 (int)에 적용되지만 두 번째 예제에는 적용되지 않습니다 (std::promise은 이동 전용 임). 당신이 std::function를 사용하고 직접 람다를 호출하지 않는 경우, 코드가 잘 작동하는지주의 :

std::bind([](std::promise<int>& p) { p.set_value(42); }, std::move(p))(); 

std::function을 사용하려면, 당신은 어떤 종류의 래퍼로 약속을 포장해야합니다. 표준 std::reference_wrapper은 충분합니다 : 당신은 그러나 원래 p 변수의 수명에 대해 걱정할 필요가

std::promise<int> p; 
std::function<void()> foo = std::bind([](std::promise<int>& p) {}, std::ref(p)); 
foo(); 

. 한 가지 다른 옵션은 std::shared_ptr 안에 관리를 둘러싼 약속을 전달하는 것입니다.

+0

당신 말이 맞습니다. 'std :: function'에는 복사 가능한 타입이 필요합니다. 대신'std :: shared_ptr'을 사용할 것입니다. 매우 감사합니다! –

관련 문제