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

C++技术疑问:传递*ptr给引用参数是否触发shared_ptr指向对象拷贝?

关于std::shared_ptr解引用传递的拷贝疑问

第一段代码

#include <memory>

void DoSomething(const int& other)
{
    //DO SOMETHING
}

int main()
{
    auto ptr = std::make_shared<int>();

    DoSomething(*ptr);

    return 0;
}

请问,当将*ptr传递给DoSomething()函数时,是否会因为*ptr的操作而在传递对象前产生对象拷贝?还是完全以引用方式传递?

第二段代码

auto ptr = std::make_shared<int>();
auto aux = *ptr;//This causes a copy...

DoSomething(aux);

这种情况肯定会触发对象拷贝,但第一种情况我不确定是否会在以引用传递前产生拷贝。


解答

第一种情况不会产生任何拷贝,完全是以引用方式传递的。

std::shared_ptr<int>的operator*()返回的是int&类型的引用,当你把这个引用传给接受const int&参数的DoSomething时,编译器会直接把函数参数的引用绑定到ptr指向的那个原始int对象上,全程没有临时对象被创建,自然也就不存在拷贝操作。

而第二段代码里的auto aux = *ptr;,这里aux是一个新的int对象,编译器会调用int的拷贝构造函数,把*ptr指向的对象的值复制到aux中,这才产生了拷贝。后续传递aux给函数时,虽然也是引用传递,但绑定的是aux这个拷贝出来的对象,和原对象无关。


内容的提问来源于stack exchange,提问作者Weiner Lemes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:52:19