如何理解`std::make_shared<Object>("foo")`?

How to understand `std::make_shared<Object>("foo")`?

std::make_shared<Object>("foo") 是做什么的?

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");

我知道 std::make_shared<T> 是模板 class 我可以理解 Object("foo") 确实是一个临时对象。但是我看不懂std::make_shared<Object>("foo").

谁能一步一步地向我解释创建对象的顺序和它完成的操作?

std::make_shared是模板函数,不是模板class。

函数的模板参数指定要创建的类型。

函数的参数按原样传递给该类型的构造函数。

函数 returns 一个 std::shared_ptr 保存指向所创建类型的指针。

因此,std::make_shared<Object>("foo") 动态创建一个 Object"foo" 构造的实例,并且 returns 一个 std::shared_ptr<Object> 持有指向该实例的指针。

这相当于以下内容(但不完全相同,因为幕后涉及额外的优化):

std::shared_ptr<Object> p1(new Object("foo"));
std::make_shared<Object>("foo")

方法

请注意此代码开头的 std::make_shared。它标识一个函数。如果我们把实际的函数放在一边,退后一步,那么在 <> 符号和 () 符号之前你有一个函数名。

通用

这段代码中的指定泛型T在本例中指定为Object。将其视为临时对象并不是一个好主意。是规范。

来电

("foo") 确保调用该函数并将参数传递给它。

底线

documentation 为您提供了正确的描述:

它告诉您指定的给定类型(在本例中为 Object)的构造函数将被实例化并包装在 shared_ptr.