我最近使用的是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
测试呼叫的行为是一个可靠的标准吗?
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
}
答案 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);
}