Это правильный способ сделать это. (Там нет буквально ничего, чтобы добавить к ответу)
Если вы проверяете его с чем-то вроде Coliru, обратите внимание, что вы не увидите выход из, скажем
void asv(std::string s){
std::cout << s << std::endl;
}
, потому что без указания запуска политика (std::launch::async
или std::launch::deferred
), std::launch::deferred
используется, и поэтому асинхронный вызов оценивается лениво. (Он не ждет с оценкой до первого вызова nontimed ожидания на возвращаемом будущем.)
Это предполагает, что вы хотите будущее, а не реальная нить. Если вы хотите настоящую нить, std::thread
- это то, что вы хотите.
--- редактировать ---
После недолгих поисков я обнаружил, что libstdC++ hasn't implemented swap
and move
for file streams (поиск 27.9
). Итак, если вы используете GCC или Clang с libstdC++, ответ заключается в том, что вы не можете делать то, о чем вы просите, даже если он полностью соответствует стандарту.
Также кажется, что Visual Studio имеет совершенно другую ошибку, которая, однако, также предотвращает использование этого случая. Для получения дополнительной информации и возможного обходного пути обратитесь к this SO question and answer.В основном, хотя он реализовал конструкторы перемещения, создатель копирует вместо распадов аргументов.
std :: async (asv, std :: move (s)); не может быть скомпилирован. Но asv (std :: move (s)); могут быть скомпилированы. Вы можете неправильно понять мой смысл. – user3186766
@ user3186766 Вы добавили '#include' директива? http://coliru.stacked-crooked.com/a/c8f31d047d59ef70 –
Xarn
Да. Я нахожу, что C++ не может передать ссылку rvalue на функцию <>. – user3186766