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

时间:2015-02-27 04:39:43

标签: c++ c++11 parameters shared-ptr

我最近使用的是std的smartptrs,我用“shared_ptr”编写了大量代码,我脑子里有一些问题:

  1. 有两个类:

    class base{}
    
    class drived: public base{}
    

    并且还有两个这样的功能:

    void fconst(const shared_ptr<classA>& obj){}
    
    void f(shared_ptr<classA>& obj){}
    
  2. 这个函数用于调用测试:

    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*作为参数时,调用者可以将所有base的子传输作为参数。

    当使用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)
    

    谢谢你的帮助!

    编辑:   谢谢〜,我也有跟随代码的问题:

    void test()

    {

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

    F(OBJ); //这是vc ++中的错误,因为type不兼容

    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
    

    }

1 个答案:

答案 0 :(得分:0)

在你的第一个例子中,当调用const&amp;版本,编译器从你的shared_ptr创建一个临时的shared_ptr,因为temporaries可以绑定到const&amp;,一切正常。

请注意,这非常糟糕,我建议您使用statis_pointer_cast投射shared_ptr,或者接受对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);

}