C++ 是否无法以静默方式创建共享\u ptr?
考虑以下代码:C++ 是否无法以静默方式创建共享\u ptr?,c++,templates,shared-ptr,C++,Templates,Shared Ptr,考虑以下代码: #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 ) ); } #包括 A类{}; B类:公共A{}; void func(标准::共享\u ptr ptr)
#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 ) );
}
#包括
A类{};
B类:公共A{};
void func(标准::共享\u ptr ptr)
{
}
int main(int argc,char*argv[])
{
func(std::shared_ptr(新B));
}
语法std::shared_ptr(新B)
要求指定A
类。如果类位于名称空间中,并且在实际不需要时使代码过于冗长,这将是一件痛苦的事情
是否没有STL模板函数可以使语法更轻,并自动推导出A
?
我想的是这样的:func(std::make_shared(new B))
,但这不是std::make_shared
的意思
我的意思是,pair
也一样,您可以使用std::make_pair
而无需指定第一/第二对类型,它们是自动推断的。共享的\u ptr
是否没有“等价物”
但这不是std::make_shared的目的
相反,这是std::make_shared
的理想用例:
func(std::make_shared<B>());
func(std::make_shared());
不仅不需要指定A
,而且我们还具有指向对象和控制块具有共享分配的优势
您的示例具有未定义的行为,因为共享指针将通过指向非多态基的指针删除对象。此
make_shared
版本没有此问题。相关:。假设您找不到给定派生类型的基类。即使可以,您对struct X{};结构Y{};结构A:X{};结构B:A,Y{}代码>?哪个基地是B
最基本的基地?但这不是std::make_shared的意思。
你为什么这么认为?据我所知,这是一个理想的用例。与您的示例不同,该示例没有未定义的行为。@maximum_prime_是_463035818:如果func采用shared_ptr
,它将选择A
。如果它需要共享\u ptr
它将拾取Y
。如果它重载并同时使用这两个参数,我会期望出现一个错误,说明编译器无法推断参数…@eerorika:那么语法是什么?如果不指定A
模板参数,我就无法使用std::make_shared
。好吧,这正是我想要的,我很惊讶std::make_shared
没有帮助…但我根本没有正确使用make_shared
!