Зачем нужен конструктор копирования для 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 устранило проблему для меня.

Другие вопросы по тегам