最近,我阅读了“并行中的并发性”一书中有关并行快速排序实现的部分内容。我尝试检查书中提到的代码,并在此部分收到错误:
struct listPart
{
list<T> data;
promise<list<T>> promise;
};
listPart newLowerPart;
...
parts.push(move(newLowerPart));
编译器给出错误
该错误发生在listPart的生成的副本构造函数中。
我猜想尝试移动newLowerPart,它尝试使用Promise的已删除副本构造函数。我以为创建自定义副本构造函数会有所帮助,但是即使尝试在其中移动Promise也给了我同样的错误。您能帮我解决这个问题吗?
先感谢您
最佳答案
请记住,正确处理右值需要特殊处理。因此,您的容器应至少提供push
的两个版本:
void push(const T& t); //'t' is coopied
和
void push(T&& t); //'t' is moved
另外,您应该为
listPart
定义move构造函数,并禁止复制:解:
struct listPart
{
list<T> data;
promise<list<T>> promise;
listPart(const listPart&) = delete;
listPart(listPart&& source)
: data(std::move(source.data))
, promise(std::move(source.promise))
{ }
};
如我所展示的,您不应该为
listPart
定义副本构造函数-应该将其删除,或者(在C++ 11之前的情况下)为私有(private),不提供任何实现。这是因为未定义复制std::promise(删除了其复制构造函数),因此在这种情况下,复制listPart
实例是没有意义的。