为什么std :: make_shared必须提供类型信息,但std :: make_pair不必提供?

时间:2015-09-22 18:22:02

标签: c++

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

std::make_pair(5, "foo");

但是当我们打算创建一个shared_ptr时,我们必须提供类型信息:

std::make_shared<Foo>("Boo", 1024);

是否有任何理由使它们与众不同?

3 个答案:

答案 0 :(得分:8)

函数std::make_pair<T1, T2>创建一对std::pair<T1, T2>,其中类型T1T2是函数的参数类型。因此,它们可以由编译器推断出来,通常您不需要明确地提供它们。

函数std::make_shared<T>创建一个类型为T的新对象,并返回存储此对象的shared_ptr<T>。该函数将其所有参数传递给T的构造函数。编译器无法从参数中推导出类型T。即使论证是例如const T&编译器无法知道您是要创建shared_ptr<T>还是shared_ptr<SomeOtherTypeWithConstructorAcceptingT>

答案 1 :(得分:1)

std::make_pair(T, U)推断出您需要pair<T, U>。简单。

std::make_shared(...)无法推断出任何东西,因为函数的参数取决于您要创建的对象的构造函数,编译器无法猜出您想要创建的对象。

答案 2 :(得分:1)

std::make_shared应该被称为emplace_shared - 它会调用任意ctor。

make_pair构建其类型的副本或移动。

他们有不同的目的:一个是类型扣除帮助,另一个是安置施工。它们都是工厂,因此是制造商名称。