1

我不明白为什么一个类有一个已删除的复制构造函数(或包含一个成员,如 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;
}
4

1 回答 1

7

您可能错过了make_shared将其参数转发给 X 的构造函数的事实。在这种情况下,您将X{8}作为构造函数参数传递,因此make_shared被迫尝试复制或移动构造。

在这个特定的示例中,删除复制构造函数会隐式删除移动构造函数,从而阻止从临时X{8}.

你可能想要写的是:

shared_ptr<X> ptr { make_shared<X>(8) };
于 2015-08-07T22:06:51.990 回答