concurrency :: task类模板可以使用哪些类型?

时间:2019-04-21 14:52:52

标签: c++ visual-c++ concurrency-runtime

我正在尝试从并发运行时task返回自定义类型。我的自定义类型只能通过静态工厂方法构造(除了可移动构造),例如:

#include <utility>

struct foo
{
    foo() = delete;
    foo(foo const&) noexcept = delete;
    foo& operator=(foo const&) noexcept = delete;

    foo(foo&&) noexcept = default;
    foo& operator=(foo&&) noexcept = default;

    static foo make_foo(int const value) noexcept { return std::move(foo{ value }); }

private:
    foo(int const) noexcept {}
};

还有一个简单的测试用例:

#include <ppltasks.h>
using namespace concurrency;

int main()
{
    auto&& task
    {
        create_task([value = 42]()
        {
            return foo::make_foo(value);
        })
    };
    auto&& result{ task.get() };
}

但是,它编译失败,产生了以下(删节的)编译器诊断:

ppltasks.h(644,1): error C2280:  'foo::foo(const foo &) noexcept': attempting to reference a deleted function
main.cpp(223): message :  see declaration of 'foo::foo'
main.cpp(223,5): message :  'foo::foo(const foo &) noexcept': function was explicitly deleted

在这里不足为奇,确实确实故意删除了复制控制器。我只是不明白,为什么不将移动构造函数视为候选对象。

似乎,只要提供default-c'tor,copy-c'tor和copy-assignment运算符,就可以编译代码。这是库(ConcRT),编译器(Visual Studio 2019 16.1.0),编程语言或我对它的控制的限制吗?

换种说法:我可以做些什么来使我的自定义类型(按原样)与concurrency::task一起使用,还是默认可构造性,副本可构造性和副本可分配性未记录的要求?

0 个答案:

没有答案