例如,当我们想要创建一个std ::对时,我们可以简单地调用:
std::make_pair(5, "foo");
但是当我们打算创建一个shared_ptr时,我们必须提供类型信息:
std::make_shared<Foo>("Boo", 1024);
是否有任何理由使它们与众不同?
答案 0 :(得分:8)
函数std::make_pair<T1, T2>
创建一对std::pair<T1, T2>
,其中类型T1
和T2
是函数的参数类型。因此,它们可以由编译器推断出来,通常您不需要明确地提供它们。
函数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
构建其类型的副本或移动。
他们有不同的目的:一个是类型扣除帮助,另一个是安置施工。它们都是工厂,因此是制造商名称。