[英]std::shared_ptr puzzle in function parameter
我最近使用的是std的smartptrs,我用“shared_ptr”編寫了大量代碼,我腦子里有一些問題:
有兩個類:
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.