在下面的代码中,如果我使用std::vector
参数调用它,我希望它使用f()
的{{1}}版本,但是它使用的是第一个,并且抱怨{{ 1}}不存在。我对模板重载解决方案的理解是,它应该使用“更专业”的版本。我认为这不适用于这里,因为这是函数重载而不是模板重载。但是它甚至没有使用正常的函数重载结果规则,否则会抱怨对std::vector
的调用不明确。
std::to_string(const std::vector<T>&)
我在做什么错了?
答案 0 :(得分:5)
与其他重载的std::vector<int>&
相反,转发引用推导的类型为const std::vector<int>&
。因此,在比较重载时,您的non-const参数与非const限定引用参数更匹配,因此可以选择一个。
一种解决方法是在另一个重载的帮助下考虑两个const资格。
template<typename T>
std::string f(std::vector<T>& member) {
return f(std::as_const(member));
}
在这里,我们借助std::as_const
获得了对member
的const引用,并委托给您原始的重载。您可能还需要提供特定于右值的重载,因为与vector
重载相比,转发参考也将得出更好的匹配。