最近,我阅读了“并行中的并发性”一书中有关并行快速排序实现的部分内容。我尝试检查书中提到的代码,并在此部分收到错误:

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实例是没有意义的。

09-25 16:23