编译库时发现的unique_ptr传递给Frame引用参数函数的疑问
关于
unique_ptr解引用传递给引用参数的澄清 嘿,我完全懂你为啥会觉得这个行为有点出乎意料——毕竟std::unique_ptr是个智能指针,乍一看好像和普通的对象引用不是一回事。不过咱们拆解一下这个调用的过程,你就明白这根本不是什么“隐式转换”,而是智能指针设计时就提供的原生支持:
首先,std::unique_ptr重载了operator*()运算符,这个运算符的作用就是返回指向对象的左值引用。它的大致实现逻辑(简化版)是这样的:
template <typename T> class unique_ptr { private: T* ptr_; // 内部存储的原始指针 public: // 解引用运算符,返回对象的左值引用 T& operator*() const noexcept { return *ptr_; } // ...其他成员函数 };
所以当你写*localFrame的时候,本质上是调用了这个operator*(),直接得到了Frame&类型的结果——而你的notify方法正好需要的就是Frame&类型的参数,两者完美匹配,完全不需要任何隐式转换。
举个更直白的例子:如果是普通原始指针Frame* rawFrame = new Frame(rows, cols);,你调用notify(*rawFrame)是理所当然的,对吧?unique_ptr的*运算符就是在模拟普通指针的解引用行为,让你能像使用原始指针一样操作智能指针指向的对象。
另外补充一句:如果你用localFrame.get()得到的是原始指针Frame*,这时候要传给notify的话,同样需要写*localFrame.get(),和直接*localFrame的效果完全一致,只是前者多了一步手动获取原始指针的操作而已。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

