std::shared_ptr 函数参数中的谜题
std::shared_ptr puzzle in function parameter
最近在用std的smartptrs,用"shared_ptr"写了海量代码,脑子里有些问题:
有两个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);
}
最近在用std的smartptrs,用"shared_ptr"写了海量代码,脑子里有些问题:
有两个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);
}