为什么在 VS 中需要 packaged_task 的复制构造函数

Why require copy constructor for packaged_task in 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 中的实例。我对 clang 也没有问题。

它有一些实现定义了关于如何实现 packaged_task 或 VS 2015 中的错误(可能稍后因为我遇到与 http://rextester.com/WBEH22233 相同的问题)

这是一个known bug in MSVC's packaged_task implementation. They're storing the callable within std::function, which requires that的论点copy-constructible。

正如@Praetorian 所说,这是 MSVC 的已知错误。

把lambda 函数与移动捕获std::unique_ptr, 放入std::packaged_func 给我带来了麻烦。 我正在做 Linux / Windows 跨平台,请注意它在 Linux 系统中运行良好。

使用其原始来源:boost::fibers::packaged_task 为我解决了问题。