有没有办法静默创建 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
版本没有这个问题。
考虑以下代码:
#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
版本没有这个问题。