You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译库时发现的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:39:13