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

Issues when creating a shared pointer of condition variable

本文关键字:问题 指针 共享 条件 变量 创建      更新时间:2023-10-16

如果之前有人问过这个问题,我很抱歉,我无法在网上找到它。 为什么编译器认为我正在尝试调用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 .. 我想我想问的是为什么不调用移动构造函数make_shared

in

std::make_shared<std::condition_variable>(std::condition_variable{})

std::condition_variable{}创建一个std::condition_variable。 这意味着std::make_shared将使用调用复制构造函数的传递参数构造其内部std::condition_variable。 如果您需要默认构造std::condition_variable则可以使用

std::make_shared<std::condition_variable>()

为什么编译器认为我正在尝试调用 std::condition_variable 的复制构造函数?

这就是编译器在调用时将使用的内容

std::make_shared<std::condition_variable>(std::condition_variable{})

std::make_shared使用任何将接受传递给它的参数的构造函数。在这种情况下,复制构造函数是一个。

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

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