簡體   English   中英

函數參數中的std :: shared_ptr謎題

[英]std::shared_ptr puzzle in function parameter

我最近使用的是std的smartptrs,我用“shared_ptr”編寫了大量代碼,我腦子里有一些問題:

  1. 有兩個類:

     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*作為參數時,調用者可以將所有base的子元素作為參數傳輸。

當使用shared_ptr ,是否有相似的字符? fconst test call的行為是一個可靠的標准嗎?

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(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

}

在你的第一個例子中,當調用const和version時,編譯器會從shared_ptr創建一個臨時的shared_ptr,並且由於temporaries可以綁定到const&,所以一切正常。

但請注意,這非常糟糕,我建議您使用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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM