C++11 为什么std::使_共享<;T类,B类参数>;(Args&;…Args)是否要求T具有复制构造函数?

C++11 为什么std::使_共享<;T类,B类参数>;(Args&;…Args)是否要求T具有复制构造函数?,c++11,make-shared,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

我不明白为什么一个具有已删除副本构造函数的类(或者包含一个成员,如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;
}
X类{
私人:
X(常数X&)=删除;
int x;
公众:
X(int-an_-int):X{an_-int}{};
X():X{10}{}
};
int main(int argc,字符**argv)
{
//失败,因为X没有复制构造函数
共享的ptr{make_shared(X{8}});
shared_ptr ptr2{new X{10}};//工作正常
返回0;
}

您可能缺少这样一个事实,即
make\u shared
将其参数转发给X的构造函数。在这种情况下,您将
X{8}
作为构造函数参数传递,因此
make\u shared
将被迫尝试复制或移动构造

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

你可能想写的是:

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

您可能缺少这样一个事实,即
make\u shared
将其参数转发给X的构造函数。在这种情况下,您将
X{8}
作为构造函数参数传递,因此
make\u shared
将被迫尝试复制或移动构造

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

你可能想写的是:

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

您需要一个复制构造函数,因为您正试图从现有的临时X{8}构造一个新的X(在make shared中)。此外,删除复制构造函数可能会隐式删除移动构造函数,因此即使X{8}是一个右值,并且可以调用移动构造函数,它不可用。
make_shared
接受构造函数参数,而不是现有实例,尝试只传递8,而不是X{8}。您需要一个副本构造函数,因为您正在尝试从现有的X{8}临时X构建一个新的X(在make shared中)。另外,删除复制构造函数可能会隐式删除移动构造函数,因此即使X{8}是一个右值并且可以调用移动构造函数,它也不可用。
make_shared
接受构造函数参数,而不是现有实例,尝试只传递8,而不是X{8}。非常感谢!是的,这就是我想要的。非常感谢!是的,这就是我想要的。