假设我声明了一个接受std::shared_ptr<const T>
参数的函数:
void func(std::shared_ptr<const T> ptr);
此功能是否会接受传递std::shared_ptr<T>
的呼叫?
答案 0 :(得分:2)
如果查看std::shared_ptr
的构造函数,其中两个是:
template< class Y >
shared_ptr( const shared_ptr<Y>& r ); // (9)
template< class Y >
shared_ptr( shared_ptr<Y>&& r ); // (10)
其中
9)构造一个
shared_ptr
,它共享由r
管理的对象的所有权。如果r
没有管理任何对象,*this
也不会管理任何对象。如果Y*
无法隐式转换为T*
,则此超载不会参与重载解析。10)从
shared_ptr
移动构建r
。构建完成后,*this
包含以前状态r
的副本,r
为空。如果Y*
无法隐式转换为T*
,则此超载不会参与重载解析。
这些构造函数不是explicit
,而T*
肯定可以隐式转换为const T*
,这只是一种资格转换。所以,是的,该功能将接受它。 Simple Demo
答案 1 :(得分:2)
您可以传递shared_ptr,但是您只能调用const方法:
void foo(std::shared_ptr<const A> val)
{
val->ConstMethod();
val->Method(); // Denied
}
//....
std::shared_ptr<A> a(new A());
foo(a);