gpt4 book ai didi

c++ - 为什么重载决策不选择我的模板函数的 std::vector 重载?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:32 25 4
gpt4 key购买 nike

在下面的代码中,我希望它使用 std::vector f() 的版本如果我用 std::vector 调用它参数,但它使用第一个并提示 std::to_string(const std::vector<T>&)不存在。我对模板重载决议的理解是它应该使用“更专业”的版本。不知何故,我认为这在这里不适用,因为这是函数重载而不是模板重载。但它甚至没有使用正常的函数重载结果规则,否则它会提示对 f() 的模棱两可的调用。 .

#include <vector>
#include <string>

template<typename T>
std::string f(T&& member) {
return std::to_string(member);
}

template<typename T>
std::string f(const std::vector<T>& member) {
return std::to_string(member[0]);
}

int main() {
int a = 42;
printf("%s\n", f(a).c_str()); // OK

std::vector<int> b = { 42 };
printf("%s\n", f(b).c_str()); // ERROR: to_string doesn't have a std::vector overload

return 0;
}

我做错了什么?

最佳答案

转发引用推导的类型是std::vector<int>& ,而不是 const std::vector<int>&另一个过载。因此,在比较重载时,您的非常量参数与非常量限定引用参数更匹配,因此选择了一个。

解决它的一种方法是在另一个重载的帮助下考虑两个 const 限定条件。

template<typename T>
std::string f(std::vector<T>& member) {
return f(std::as_const(member));
}

这里我们获得了对member 的const 引用在 std::as_const 的帮助下并委托(delegate)给你原来的重载。您可能还想提供一个特定于右值的重载,因为与您的 vector 相比,转发引用也会推断出更好的匹配。过载。

关于c++ - 为什么重载决策不选择我的模板函数的 std::vector 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57087402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com