Ответ 1
Мотивация для этих двух будущих типов восходит к перемещению семантики, только типов перемещения и новой функции С++ 11 для возврата типов только для перемещения из обычных функций.
В С++ 98/03, если вы хотите вернуть тип из функции factory:
A
make_A()
{
A a;
// ...
return a;
}
то A
должно быть CopyConstructible
. Тогда, совершенно новый в С++ 11, мы можем вернуть A
, даже если это не CopyConstructible
, ему нужно только MoveConstructible
.
Но что произойдет, если вы попытаетесь выполнить make_A
одновременно, скажем, используя фьючерсы. Разве это не было бы преступлением, если бы вы могли распараллелить make_A
, если A
есть CopyConstructible
?! Вам придется отказаться от одной оптимизации, преследуя другую!
So future<R>
требует R
MoveConstructible
. Но вы можете получить его только один раз, потому что вы переходите от сохраненного результата.
Но получение одинакового результата для нескольких потоков также является реальной потребностью. Поэтому shared_future<R>
позволяет это, но требует R
быть CopyConstructible
.