我正在尝试从并发运行时任务返回自定义类型。我的自定义类型应该只能通过静态工厂方法构造(除了可移动构造之外),例如:
#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
这里毫不奇怪,copy-c'tor 确实被明确删除,故意的。我只是不明白,为什么不将移动构造函数视为候选人。
只要我提供一个default-c'tor、一个copy-c'tor和一个copy-assignment运算符,我似乎可以编译代码。这是库 (ConcRT)、编译器 (Visual Studio 2019 16.1.0)、编程语言还是我对它的控制的限制?
换一种说法:我能做些什么来让我的自定义类型(按原样)与concurrency::task
.