到目前为止,我有一个函数正在获取IArg
类型的参数,我可以执行以下操作:
struct IArg
{
};
struct Arg : IArg
{
};
void f (IArg* arg)
{
// do something
}
f(new Arg);
现在我得到了这个:
void f (std::shared_ptr<IArg> arg)
{
// do something
}
为什么它再次与
一起使用f(std::make_shared<Arg>());
即使std::shared_ptr<A>
和std::shared_ptr<B>
相关, A
和B
也是不同的类型,对吗?
答案 0 :(得分:8)
std::shared_ptr<T>
隐式可由std::shared_ptr<U>
构建,当且仅当U *
可隐式转换为T *
时。请参阅构造函数overload (9) on cppreference.com
。
答案 1 :(得分:5)
它的工作原理是因为std::shared_ptr
有一个tempalted构造函数,当从源指针类型到目标指针类型的隐式转换时,它可以正常工作。