std::shared_ptr 函数参数中的谜题

std::shared_ptr puzzle in function parameter

最近在用std的smartptrs,用"shared_ptr"写了海量代码,脑子里有些问题:

  1. 有两个class:

    class base{}
    
    class drived: public base{}
    

    还有两个功能是这样的:

    void fconst(const shared_ptr<classA>& obj){}
    
    void f(shared_ptr<classA>& obj){}
    

和这个用于调用测试的函数:

void test()

{

 std::shared_ptr<drived> obj(std::make_shared<drived>()); 


 f(obj);         // this is error in vc++, because type is not compatibility

 fconst(obj);    // this is ok in vc++

}

我理解f调用错误,但为什么fconst调用正常?

如果使用base*有一个好处:当函数接收到一个base*作为参数时,调用者可以传递所有基的child作为参数。

和使用shared_ptr时,是否有相似的性质? fconst 测试调用的行为是可靠的标准吗?

2。 什么时候shared_ptr传入函数参数,什么时候这些用法:

void f(const shaerd_ptr<classA> obj)

void f(const shaerd_ptr<classA>& obj)

void f(shaerd_ptr<classA> obj)

void f(shaerd_ptr<classA>& obj)

感谢您的帮助!

编辑: 谢谢~,我也有以下代码的问题:

无效测试()

{

std::shared_ptr obj(std::make_shared());

f(对象); // 这是 vc++ 中的错误,因为类型不兼容

fconst(obj); // 这在 vc++

中是可以的

// 继续..

std::shared_ptr<base> objBase(std::make_shared<base>()); 

f(objBase);  // this is ok, why? 

fconst(objBase); // this is ok after your answer

}

在您的第一个示例中,当调用 const& 版本时,编译器从您的 shared_ptr 创建一个临时 shared_ptr,并且由于临时对象可以绑定到 const&,所以一切正常。

但是请注意,这很糟糕,我建议您将 shared_ptr 转换为 statis_pointer_cast,或者接受对 base 的引用或 const 原始指针。

#include <memory>

using namespace std;

class base{};

class drived: public base{};


void fconst(const shared_ptr<base>& obj){}

void f(shared_ptr<base>& obj){}

void f2(shared_ptr<base> a) {}

int main()
{

 std::shared_ptr<drived> obj(std::make_shared<drived>());

 auto h = std::statis_pointer_cast<base>(obj);
 f(h);
 f2(obj);
 fconst(obj);

}