查看 20.8.2.2类模板shared_ptr [util.smartptr.shared] 我意识到std::shared_ptr
有模板副本构造函数和赋值运算符,当且仅当shared_ptr<Derived>
可转换为shared_ptr<Base>
时才允许从Derived*
转换为Base*
。这些转换(仅在我的理解中)仅通过模板化的复制构造函数和赋值运算符完成。但是,似乎我也可以将shared_ptr<Derived>
传递给一个带shared_ptr<Base>&
的函数(即通过引用传递)。似乎应该有一个隐式转换运算符,但根据标准,没有。
以下代码阐明了我的意思:
#include <iostream>
#include <memory>
struct Base {};
struct Derived: Base {};
void f(const std::shared_ptr<Base>& ) {}
int main()
{
std::shared_ptr<Derived> spDerived(new Derived);
// conversion below is OK, via template copy ctor
std::shared_ptr<Base> spBase(spDerived);
// also OK, via template copy assignment operator
spBase = spDerived;
// why is this OK? Cannot see any conversion operators in
// 20.8.2.2 Class template shared_ptr [util.smartptr.shared]
f(spDerived);
}
我的问题:在这种情况下,谁在shared_ptr<Derived>
来电中执行从shared_ptr<Base>
到f(spDerived)
的转换? (对于编译器shared_ptr<Derived>
与shared_ptr<Base>
没有任何关系,即使Derived
是Base
的孩子
答案 0 :(得分:2)
通过模板复制ctor创建临时文件,该副本是引用的内容。 ctor是隐含的,所以在这种情况下可以合法地调用它。从根本上说,这个电话和f(std::string); f("hello");
之间没有区别。完全相同的机制正在起作用。它是一种常规的隐式转换。