为什么不shared_ptr <a> implicit convert to shared_ptr</a> <a const="">?</a>

时间:2012-10-03 15:40:09

标签: c++ c++11 shared-ptr const-correctness

我尝试向一些新代码引入一些const正确性(实际上是函数范例),并发现我无法将std::shared_ptr<A>传递给期望std::shared_ptr<A const>的函数。请注意,我不想强​​制 constness但引入它,这对于原始指针是合法的。

有没有办法解决这个问题?我没有找到成员函数来执行此操作。


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>)

1 个答案:

答案 0 :(得分:10)

您的案例中的问题不在于来自/到不同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));