Я столкнулся с проблемой со ссылками rvalue в MSVC 2012.
#include <thread>
#include <string>
#include <future>
void foo(std::promise<std::string> &&prms) { /* some code */ }
int main() {
std::promise<std::string> prms;
// std::future<std::string> ftr = prms.get_future();
std::thread th(&foo, std::move(prms));
// some other code
}
Компилятор говорит: ошибка C2664: ‘void (std :: обещание<_Ty> &&) ‘: невозможно преобразовать параметр 1 из’ std :: обещание<_Ty> ‘to’ std :: обещание<_Ty> &&’
Есть ли моя ошибка (тогда как это исправить) или проблема компилятора (тогда я хотел бы знать происхождение такого поведения)?
Это известная проблема в реализации Visual C ++ 2012 std::thread
, Смотрите следующую ошибку в Microsoft Connect:
Ответ на эту ошибку гласит:
Мы пытались исправить это во время разработки VC11, но она ужасно взорвалась, и нам пришлось отменить изменения. Оказывается, что std :: thread не может работать от
bind()
потому что поток должен переместить свои аргументы, иbind()
запрещено делать это (поскольку связанные функторы должны вызываться многократно без перемещения их связанных аргументов). Так что нам нужно будет переопределитьstd::thread
Ctor, чтобы избежать использованияbind()
,
Других решений пока нет …