2016-01-17 2 views
2

Я просто пробовал этот образец, чтобы понять будущее и обещать.Каким должен быть возвращаемый тип функции, которая запускается async

void func(std::promise<int>& p) { 
    p.set_value (0); 
} 

int main() 
{ 
    std::promise<int> p;      
    std::future<int> f = p.get_future(); 
    std::thread t(func, std::ref(p)); 
    int x = fut.get();    

    t.join(); 
    return 0; 
} 

Это нормально, если возвращаемый тип func является недействительным? Если да, то может быть тип возвращаемого void, если он используется с std::async

std::future<int> f = std::async(std::launch::async, func); 

ли возвращение в асинхронном выведено std::future<int> если возвращаемый тип func является void?

Просьба уточнить вопрос о возвращаемом типе функции, ответственной за установление обещания.

также, должен ли функционировать в зависимости от того, как он может использовать?

+3

Один вопрос на вопрос прошу. –

ответ

2

В первом примере функция, запускаемая конструктором std::thread, может возвращать значение или нет, значение игнорируется.

С std::async вызова возвращаемое значение подводимого функции (как определено std::result_of) задает тип шаблона возвращаемого std::future:

// function returns an int so std::async() returns a std::future<int> 
std::future<int> fut = std::async(std::launch::async, []{ return 1; }); 

В соответствии со стандартом C++11:

30.6. 8 Функциональный шаблон async

Возвращает: объект типа future<typename result_of<F(Args...)>::type>, который ссылается на общее состояние, созданное этим вызовом, на асинхронный.

Таким образом, в первом примере это не имеет значения, какой тип возвращаемого значения функции, потому что его тело функции, которая устанавливает std::promise, а не возвращаемое значение.

С возвратом std::async() оператор возврата должен возвращать общее значение в std::future.