为什么重载解析不选择模板函数的std :: vector重载?

时间:2019-07-18 04:59:39

标签: c++ templates

在下面的代码中,如果我使用std::vector参数调用它,我希望它使用f()的{​​{1}}版本,但是它使用的是第一个,并且抱怨{{ 1}}不存在。我对模板重载解决方案的理解是,它应该使用“更专业”的版本。我认为这不适用于这里,因为这是函数重载而不是模板重载。但是它甚至没有使用正常的函数重载结果规则,否则会抱怨对std::vector的调用不明确。

std::to_string(const std::vector<T>&)

我在做什么错了?

1 个答案:

答案 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重载相比,转发参考也将得出更好的匹配。

相关问题