Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否无法以静默方式创建共享\u ptr?_C++_Templates_Shared Ptr - Fatal编程技术网

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