创建条件变量的共享指针时出现问题

时间:2016-07-06 19:22:00

标签: c++ c++11 shared-ptr condition-variable

如果之前有人问我,我很抱歉,我无法在网上找到它。为什么编译器认为我试图调用std::condition_variable的复制构造函数?

#include <iostream>
#include <utility>
#include <vector>
#include <memory>
#include <condition_variable>
using namespace std;

class A {
 public:
  A() = default;
  A(A&&) = default;
  A& operator=(A&&) = default;
  A(const A&) = delete;
  A& operator=(const A&) = delete;
};
int main() {

  std::vector<std::shared_ptr<std::condition_variable>> m;
  m.push_back(std::make_shared<std::condition_variable>(std::condition_variable{}));

  // no complains here
  std::vector<std::shared_ptr<A>> m_a;
  m_a.push_back(std::make_shared<A>(A{}));

  return 0;
}

我得到的错误是我正在尝试使用std::condition_variable的已删除的复制构造函数。我想我想问的是为什么不调用{{1}调用移动构造函数}

2 个答案:

答案 0 :(得分:9)

std::condition_variable{}

std::condition_variable创建std::make_shared。这意味着std::condition_variable将使用传递的参数构造它的内部std::condition_variable,该参数调用复制构造函数。如果您需要默认构造std::make_shared<std::condition_variable>() ,那么您可以使用

{{1}}

答案 1 :(得分:4)

  

为什么编译器认为我试图调用std :: condition_variable的拷贝构造函数?`

这就是编译器在调用

时将使用的内容
std::make_shared

std::make_shared<std::condition_variable>(std::condition_variable{}) 使用任何将传递给它的参数的构造函数。在这种情况下,复制构造函数就是那个。

来自http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared

  

args - 用于构造T实例的参数列表。