4
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相同的问题)

4

2 回答 2

4

这是MSVC实现中的一个已知错误。packaged_task他们将可调用对象存储在 中std::function,这要求参数 可复制构造的。

于 2018-02-27T00:05:39.170 回答
0

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

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

使用它的原始来源:boost::fibers::packaged_task为我解决了这个问题。

于 2020-11-11T06:12:24.547 回答