C++技术疑问:传递*ptr给引用参数是否触发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
相关产品推荐
相关产品推荐

