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

C++ 创建条件变量的共享指针时出现的问题,c++,c++11,shared-ptr,condition-variable,C++,C++11,Shared Ptr,Condition Variable,很抱歉,如果以前有人问过这个问题,我无法在网上找到它。为什么编译器认为我试图调用std::condition\u变量的复制构造函数 #include <iostream> #include <utility> #include <vector> #include <memory> #include <condition_variable> using namespace std; class A { public: A() =

很抱歉,如果以前有人问过这个问题,我无法在网上找到它。为什么编译器认为我试图调用
std::condition\u变量的复制构造函数

#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;
甲级{
公众:
A()=默认值;
A(A&&)=默认值;
A&运算符=(A&&)=默认值;
A(常数A&)=删除;
A&运算符=(常量A&)=删除;
};
int main(){
std::向量m;
m、 向后推(std::使_共享(std::条件_变量{}));
//这里没有抱怨
std::向量m_a;
m_a.push_back(std::make_shared(a{}));
返回0;
}
我得到的错误是,我试图使用
std::condition\u variable
的已删除副本构造函数。。我想我想问的是,为什么调用
make_shared

为什么编译器认为我试图调用std::condition_变量的复制构造函数`

这就是编译器在调用

std::make_shared<std::condition_variable>(std::condition_variable{})
std::使_共享(std::条件_变量{})
std::make_shared
使用任何将接受传递给它的参数的构造函数。在本例中,复制构造函数是唯一的构造函数

发件人:

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


make_shared
的参数用于构造对象。在您的情况下,您正在传递一个与复制构造函数签名匹配的临时构造函数。@实际上,它与移动构造函数匹配signsture@UldisK条件_变量没有
移动构造函数
。@UldisK如果复制构造函数被明确定义为已删除,不会隐式声明移动构造函数。为什么不声明移动构造函数?@奇怪,它没有移动构造函数。没错!我不知道为什么我把搬家作业和搬家混淆了construction@Curious它也不是移动赋值:)@Arunmu它必须是,否则你怎么能有条件变量的向量?“至少我很确定这就是为什么移动构造器不行?”好奇的是,看起来你已经找到了上述问题的答案。
std::make_shared<std::condition_variable>(std::condition_variable{})
std::make_shared<std::condition_variable>()