c – 为什么shared_ptr不能隐式转换为shared_ptr?

前端之家收集整理的这篇文章主要介绍了c – 为什么shared_ptr不能隐式转换为shared_ptr?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试向某些新的代码介绍一些const正确性(实际功能范例),发现我不能通过std :: shared_ptr< A>到一个期望std :: shared_ptr< A const>的函数.请注意,我不想抛弃const,而是介绍它,这与原始指针是合法的.

有没有办法解决这个问题?我没有找到一个成员函数来做到这一点.

g 4.6.1发出的精确错误是:

error: no matching function for call to ‘foo(std::shared_ptr<A>)’
note: candidate is:
note: template<class T> std::shared_ptr<_Tp> foo(std::shared_ptr<const _Tp>)

解决方法

您的情况下的问题不在于/到不同的std :: shared_ptr的可能转换,而是与模型函数的类型推断方式有关.

当编译器尝试将函数调用与模板进行匹配时,它将只接受完全匹配,即完全没有类型转换.在这种情况下,您的函数采用std :: shared_ptr< const T>,调用者具有std :: shared_ptr< U>其中U不是const.因为匹配不准确,它会丢弃模板并选择下一个重载候选.

简单的解决方法是:避免类型推断,并提供模板参数:

std::shared_ptr<A> p;
foo<A>(p);             // will use the templated shared_ptr conversion

或者自己执行转换:

foo(std::shared_ptr<const A>(p));

猜你在找的C&C++相关文章