多态智能指针的使用

4

到目前为止,我一直使用了一个接受类型为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>());

即使 AB 有关联,std::shared_ptr< A >std::shared_ptr< B > 仍然是不同的类型,对吗?
2个回答

8

仅当 U * 隐式转换为 T * 时,std::shared_ptr<U> 才可以隐式构造为 std::shared_ptr<T>。请参见构造函数重载 (9) on cppreference.com


希望这个检查不是运行时的。 - Narek
当然不是。你可以从短语“如果……,则此重载不参与重载决议”中看出来。重载决议是纯粹的编译时事情。实现将在该构造函数上使用SFINAE,以在适当时启用它。 - 5gon12eder
1
没听懂你说的话,抱歉。 - Narek
我不确定有什么不清楚的地方,但您可以放心,没有运行时检查。但请注意,转换并非免费。每次制作std::shared_ptr的副本都需要付费。 - 5gon12eder

5

这个能够工作是因为std::shared_ptr有一个模板构造函数,当源指针类型可以隐式转换为目标指针类型时,它就会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接