为什么std :: make_shared <class t,=“”class ... args =“”>(Args&amp;&amp; ... args)要求T有复制构造函数?

时间:2015-08-07 21:56:40

标签: c++11 make-shared

我不明白为什么一个拥有已删除的拷贝构造函数的类(或者包含一个成员,如ifstream,有一个已删除的拷贝构造函数,并且它也有一个已删除的拷贝构造函数)可以“#”;与make_shared()一起使用?此代码显示了我正在谈论的内容

class X {
 private:
     X(const X&) = delete;
     int x;
 public:
     X(int an_int)  : x{an_int} {};
     X() : x{10} {}
 };
int main(int argc, char** argv) 
{
   // fails because X has no copy constructor 
   shared_ptr<X> ptr { make_shared<X>( X{8} ) };

   shared_ptr<X> ptr2 { new X{10} };// works fine

   return 0;
}

1 个答案:

答案 0 :(得分:7)

您可能会遗漏make_shared将其参数转发给X的构造函数的事实。在这种情况下,您将X{8}作为构造函数参数传递,因此make_shared被强制使用尝试复制或移动建筑。

在此特定示例中,删除复制构造函数已隐式删除了移动构造函数,从而阻止了临时X{8}的构造。

你可能想写的是:

shared_ptr<X> ptr { make_shared<X>(8) };