C++ 为什么必须提供std::make_shared类型信息,但std::make_pair不提供';不必吗?

C++ 为什么必须提供std::make_shared类型信息,但std::make_pair不提供';不必吗?,c++,C++,例如,当我们想要创建std::pair时,我们可以简单地调用: std::make_pair(5, "foo"); 但当我们打算创建共享的ptr时,我们必须提供类型信息: std::make_shared<Foo>("Boo", 1024); std::使_共享(“Boo”,1024); 有什么原因使它们不同吗?std::make_pair(T,U)推断出您想要一对。简单 std::make_shared(…)无法真正推断出任何东西,因为函数的参数取决于要创建的对象的构造函数,

例如,当我们想要创建std::pair时,我们可以简单地调用:

std::make_pair(5, "foo");
但当我们打算创建共享的ptr时,我们必须提供类型信息:

std::make_shared<Foo>("Boo", 1024);
std::使_共享(“Boo”,1024);
有什么原因使它们不同吗?

std::make_pair(T,U)
推断出您想要一对
。简单


std::make_shared(…)
无法真正推断出任何东西,因为函数的参数取决于要创建的对象的构造函数,编译器也猜不出你想要生成什么对象。

函数
std::make_pair
创建一对
std::pair
,其中类型
T1
T2
是函数的参数类型。因此,编译器可以推导出它们,通常不需要显式地提供它们


函数
std::make_shared
创建类型为
T
的新对象,并返回存储此对象的
shared_ptr
。函数将其所有参数传递给
T
的构造函数。编译器无法从参数推断类型
T
。即使参数是例如
const T&
,编译器也无法知道您是否要创建
shared\u ptr
shared\u ptr
std::make\u shared
应被称为
emplace\u shared
——它调用任意的ctor

make_pair
构造其类型的副本或移动


它们有不同的用途:一个是用于类型推断帮助,另一个是用于模板构建。他们都是工厂,因此,生成名称。

您希望编译器如何准确地推断您想要创建的类型
make\u shared
?std::make\u shared是一个可变模板,将参数传递给模板参数
std::make\u pair
中提到的类型的构造函数总是生成
std::pair
,因此它只需要从函数参数推断模板参数类型。但是
std::make_shared
除了必须从函数参数推断模板参数类型之外,还可以生成任何类型。您必须使用
std::make_shared
指定创建的类型,因为它没有像
std::make_ptr
那样预先知道它将是什么的优势。因为这将构造一个临时的
Foo
make_shared
的要点是不会发生不必要的复制-对象被实例化并直接绑定到一个
shared_ptr
中。是否有可能通过使用
std::forward
实现一个自酿酒
make_shared
,同时保持效率?我指的是一个没有键入info。@AhSengFan您可以尝试避免显式模板参数
,而使用显式构造函数
Foo()
的解决方案。为什么会更好?@AhSengFan对于初学者来说,如果您的类型没有移动构造函数,那么任何带有显式构造函数的解决方案都必须创建一个临时构造函数——这是没有办法的。带有模板参数的解决方案没有这样的问题。如果想要方便,至少
auto-sp(std::make_-shared())
不必解释
std::shared\u-ptr
来创建sp,尤其是当类型比T1更复杂时。为什么不存在一个重载
make_shared
,当您不传递任何模板参数而只传递一个运行时参数时,就推断出
t
<代码>模板标准::共享\u ptr使\u共享(T&&arg)
我一直希望有一个
make_smart
工厂,它不仅可以根据我想要的推断类型,还可以推断所有权:)@TemplateRex,它需要RPM指令,在现代CPU上的可用性很差。谢谢,谢谢!“
std::make_shared
应称为
emplace_shared
”。。。这就是几个月来困扰我的
std::make_shared
+1(现在我可以睡个好觉了)