我不想在同步队列中使用复制构造函数

ora*_*ora 2 c++ constructor copy

此 pop 方法需要一个复制构造函数。但我不想拥有这个。我希望不调用该项目的构造函数或移动构造函数。我必须如何实施它?

auto pop() {
    std::unique_lock<std::mutex> lock(mutex_);
    cond_.wait(lock, [this]() {return queue_.empty() == false; });

    T& item = queue_.front();
    queue_.pop();

    return item;
}
Run Code Online (Sandbox Code Playgroud)

T& item = queue_.front() 在编译器错误消息之后需要一个复制构造函数。

Sto*_*ica 7

我希望不调用该项目的构造函数或移动构造函数

那么你必须让你的代码满足返回值优化的条件。这是一种无保证的复制省略形式,允许编译器

  • 不创建临时返回对象。
  • 如果不可能,只需移至返回对象即可。

为此,您必须返回一个本地对象,而不是引用。在您显示的代码片段中,这是实现这一目标的最小更改:

T item = std::move(queue_.front());
Run Code Online (Sandbox Code Playgroud)

我们通过移动从队列中提取项目,因此仅移动类型可以在这里工作。

当我们return item;这样做时,就满足了返回值优化的条件,并且返回对象最多会在可能的情况下再次移动。