std::shared_ptr 在通过引用传递时如何跨类层次结构进行转换
How does std::shared_ptr converts across class hierarchy when passing by reference?
查看 20.8.2.2 类模板shared_ptr [util.smartptr.shared] 我意识到std::shared_ptr
具有模板复制构造函数和赋值运算符,当且仅当Derived*
可转换为Base*
时,才允许从shared_ptr<Derived>
转换为shared_ptr<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);
}
我的问题:在这种情况下,谁在呼叫f(spDerived)
中执行从shared_ptr<Derived>
到shared_ptr<Base>
的转换?(对于编译器shared_ptr<Derived>
与shared_ptr<Base>
没有任何关系,即使Derived
是Base
的子代)
临时是通过模板复制 ctor 创建的,该副本是引用的。CTOR 是隐式的,因此在这种情况下可以合法地调用它。从根本上说,这个电话和说f(std::string); f("hello");
之间没有区别。完全相同的机制也在起作用。这是常规的隐式转换。
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- C++ 类层次结构中的"对齐"是什么意思?
- 类层次结构中的运算符重载
- C++ 提升 - 包含类层次结构对象的类的序列化
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 访客设计模式和多层类层次结构
- C++要在其中添加接口功能的类层次结构
- 无法使用"enable_if"和"is_base_of"将模板函数"operator+"的重载限制到我的类层次结构
- 在类层次结构中覆盖C++
- 如何在 C++1x 中为类层次结构实现完全通用的访问者?
- 如何调用遍历类层次结构的成员函数
- 沿类层次结构的私人继承,为什么在整个层次结构中都需要朋友
- 具有向下强制转换函数指针的类层次结构
- Arduino类层次结构,字符串和内存泄漏
- OOP - 类层次结构的顶部称为什么
- 当类层次结构中只有一个类时,请避免在每个功能呼叫上读取V-Table的开销
- 函数和多个类层次结构
- 可克隆的类层次结构和unique_ptr
- std::shared_ptr 在通过引用传递时如何跨类层次结构进行转换