当通过引用传递时,std :: shared_ptr如何在类层次结构中进行转换?

时间:2015-04-18 23:09:54

标签: c++ c++11 type-conversion shared-ptr implicit-conversion

查看 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>没有任何关系,即使DerivedBase的孩子

1 个答案:

答案 0 :(得分:2)

通过模板复制ctor创建临时文件,该副本是引用的内容。 ctor是隐含的,所以在这种情况下可以合法地调用它。从根本上说,这个电话和f(std::string); f("hello");之间没有区别。完全相同的机制正在起作用。它是一种常规的隐式转换。