为什么在VS中需要复制构造函数来创建packaged_task?

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{}); 

我收到了“error C2280: 'MoveOnlyOperation::MoveOnlyOperation(const MoveOnlyOperation &)': attempting to reference a deleted function”错误信息

C++ 11的文档表示可以通过打包任务来完美转发实例。我在clang上也没有问题。

这里有一些关于如何实现打包任务的实现定义或者是VS 2015中的一个bug(可能后续版本也会出现同样的问题,因为我在http://rextester.com/WBEH22233上遇到了相同的问题)。


并非所有版本的VS都支持C++11的所有功能。请参见https://msdn.microsoft.com/en-us/library/hh567368.aspx。 - R Sahu
是的,但这似乎是一个库的错误。 - Ghita
我希望有比我更有知识的人能够帮助你。 - R Sahu
这对我来说看起来像是一个库的 bug。MSVC 正在将可调用对象存储在 std::function 中,这就要求它必须是可复制的。我没有看到标准中有任何规定可调用对象需要是可复制构造的。 - Praetorian
2个回答

4

这是 MSVC 的 packaged_task 实现中的一个 已知问题。他们在 std::function 中存储可调用对象,这要求参数是可复制的(requires)


0

如@Praetorian所说,这是MSVC已知的bug。

当我将lambda函数与移动捕获的std :: unique_ptr 放入std :: packaged_func 中时,它给我带来了麻烦。而且我正在进行Linux / Windows跨平台开发,需要注意的是,在Linux系统中它完美运行。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接