C++ 线程多次调用析构函数

C++ 线程多次调用析构函数,c++,multithreading,c++11,destructor,C++,Multithreading,C++11,Destructor,我不熟悉c++11中的std::thread。我尝试将函子对象传递给线程,而不是lambda 然而,我得到的输出让我大吃一惊:似乎析构函数被调用了6x次 代码段: #include <iostream> #include <thread> struct A { A() { std::cout << "creating A" << std::endl; } void operator()() { std::

我不熟悉c++11中的
std::thread
。我尝试将
函子对象
传递给线程,而不是
lambda

然而,我得到的输出让我大吃一惊:似乎析构函数被调用了6x次

代码段:

#include <iostream>
#include <thread>

struct A
{
  A()
  { 
    std::cout << "creating A" << std::endl; 
  }

  void operator()()
  {
    std::cout << "calling ()-operator" << std::endl;
  }

  ~A()
  { 
    std::cout << "destroying A" << std::endl;   
  }
};

int main()
{
  {
    std::thread t( (A()) );
    t.join();
  }
  std::cin.get();
}

任何解释都将不胜感激

您无法捕获对象可以创建的所有路径。将复制构造函数添加到
a

A( A const &a )
{
    std::cout << "creating A (copy)" << std::endl;
}
A(常数&A)
{

std::我可以添加一个复制构造函数来查看它被调用了多少次吗…您还可以向复制和移动构造函数添加输出,以查看该对象的实现情况。这是您特定的标准库实现的实现细节,但是。很好,复制构造函数被调用了5次,因此6个dtor调用非常有意义。剩下的问题是:为什么有5个副本?这可能是您感兴趣的。@user3796535从中移动的对象仍然需要销毁。移动必须将源对象保留在“未指定,但有效”状态状态。dtor当然也会对此类对象调用。感谢您的回答。正如我在上面的评论中所说,我添加了复制和移动析构函数,并且对象确实被复制/移动。使用std::ref不会显示这种行为。但是,有没有解释为什么对象被复制了这么多,或者只是msvc11的implemantation?@user3796535,这是唯一的msvc11实现。据我所知,gcc只生成两次创建/销毁
A
对象的程序。
A( A const &a )
{
    std::cout << "creating A (copy)" << std::endl;
}