Digamos que eu tenha uma função que retorna um std::vector
e eu queira chamá-la de forma assíncrona.
std::vector<int> foo(int n);
int main() {
auto future_vector = std::async(foo, 999);
// ... other stuff
// Questions are all about this:
auto actual_vector = future_vector.get();
// ... do stuff with actual_vector ...
}
Q1: actual_vector
O copy-constructed ou o move-constructed são do estado compartilhado? Preciso escrever std::move(future_vector.get())
explicitamente?
Q2: Supondo que a função seja concluída e não cumpra mais a promessa: o tempo de vida do estado compartilhado termina quando get
é chamado no futuro ou ele persiste até que o futuro atinja o fim de seu tempo de vida?
std::future::get
retorna por valor (exceto na especialização para tipos de referência). Chamarmove
uma função aa retornando por valor é sempre errado. Na verdade, dar qualquer argumento que não apenas nomeie uma variável (membro) parastd::move
é quase sempre errado.A chamada do construtor usada para construir
actual_vector
depende completamente da implementação deget
. No entanto, o padrão determina que o valor seja produzido como se por chamadastd::move(v)
ondev
é o estado compartilhado, então a construção move será usada se possível.std::future::get
também é especificado para liberar o estado compartilhado, ou seja, ele deve destruir o objeto no estado compartilhado se forstd::future
o último objeto que faz referência ao estado compartilhado.