有没有办法静默创建 shared_ptr ?

Is there no way to have shared_ptr be silently created?

考虑以下代码:

#include <memory>

class A {};
class B : public A {};

void func( std::shared_ptr<A> ptr )
{
}

int main( int argc, char* argv[] )
{
    func( std::shared_ptr<A>( new B ) );
}

语法 std::shared_ptr<A>( new B ) 需要指定 A class。如果 class 位于命名空间中,这会很痛苦,并且在实际上不需要时会使代码过于冗长。

有没有STL模板函数可以让语法更简洁,自动推导A? 我在想类似的东西:func( std::make_shared( new B ) ) 但这不是 std::make_shared 的意思。

我的意思是,pair 也是一样的,你可以使用 std::make_pair 而不必指定 first/second 对类型是什么,它们会自动推导出来。 shared_ptr 没有“等价”吗?

but that's not what std::make_shared is meant for.

相反,这是 std::make_shared 的理想用例:

 func(std::make_shared<B>());

不仅不需要指定A,而且我们有指向对象和控制块共享分配的优势。


您的示例具有未定义的行为,因为共享指针会通过指向非多态基的指针删除对象。这个 make_shared 版本没有这个问题。