Зачем нужен конструктор копирования для packaged_task в VS
class MoveOnlyOperation
{
public:
MoveOnlyOperation() = default;
MoveOnlyOperation(const MoveOnlyOperation&) = delete;
MoveOnlyOperation(MoveOnlyOperation&&) = default;
int operator()()
{
return 0;
}
};
Я хочу обернуть экземпляр объекта внутри packaged_task следующим образом:
std::packaged_task<void()> task(MoveOnlyOperation{});
Я получаю сообщениеоб ошибке "C2280:" MoveOnlyOperation::MoveOnlyOperation(const MoveOnlyOperation &) ": при попытке обратиться к удаленной функции"
Документация для C++ 11 говорит, что можно усовершенствовать экземпляр внутри packaged_task. У меня также нет проблем с лязгом.
В нем есть что-то, что определяет реализация того, как должен быть реализован packaged_task, или ошибка в VS 2015 (и, возможно, позже, потому что у меня такая же проблема с http://rextester.com/WBEH22233).
1 ответ
Это известная ошибка в MSVC packaged_task
реализация. Они хранят вызываемое внутри std::function
, который требует , чтобы аргумент был конструктивно копируемым.
Как сказал @Praetorian, это известная ошибка MSVC.
У меня возникли проблемы, поставить лямбда-функцию с перемещением захваченного
std::unique_ptr
, в
std::packaged_func
. И я делаю кросс-платформу Linux / Windows, обратите внимание, что она отлично работает в системе Linux.
Использование исходного кода: boost:: fiber::packaged_task устранило проблему для меня.