многопоточность — подвижные параметры в конструкторе std :: thread (Visual C ++ 2012)

Я столкнулся с проблемой со ссылками 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> &&’

Есть ли моя ошибка (тогда как это исправить) или проблема компилятора (тогда я хотел бы знать происхождение такого поведения)?

1

Решение

Это известная проблема в реализации Visual C ++ 2012 std::thread, Смотрите следующую ошибку в Microsoft Connect:

Конструктор std :: thread не обрабатывает подвижный объект

Ответ на эту ошибку гласит:

Мы пытались исправить это во время разработки VC11, но она ужасно взорвалась, и нам пришлось отменить изменения. Оказывается, что std :: thread не может работать от bind()потому что поток должен переместить свои аргументы, и bind() запрещено делать это (поскольку связанные функторы должны вызываться многократно без перемещения их связанных аргументов). Так что нам нужно будет переопределить std::threadCtor, чтобы избежать использования bind(),

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]