gpt4 book ai didi

c++ - C++中的模板函数重载

转载 作者:IT老高 更新时间:2023-10-28 21:35:29 25 4
gpt4 key购买 nike

我有以下定义。

using namespace std;

template <typename T>
void foo(const T &s) {
cout << 1;
}

template <typename T>
void foo(const T *s) {
cout << 2;
}

int main(int argc, const char * argv[]) {
char str[] = "ss";
char *s = str;
foo(s);

return 0;
}

然后输出

1

据我了解,这两个版本都必须经过 const 转换。那么 void foo(const T *s) 更专业,应该被调用。然而编译器选择了void foo(const T& s)。有什么解释?

最佳答案

有人指出编译器选择的模板参数

void f(char * const&)
void f(const char *);

在这里,请注意编译器需要一个指向 char 的指针,char*,作为第一个函数,它是一个 const 引用。如果您发现对于您的案例它更喜欢第一个模板,这可能会让人感到惊讶,但对于以下两个,它会更喜欢第二个

template <typename T>
void foo(const T& s) {
cout << 1;
}

template <typename T>
void foo(T &s) {
cout << 2;
}

所以,当然,它有时会查看 const。你的情况为什么没有呢?因为如果其他函数也有引用,它只会查看 const 以获取引用。

在您的情况下,从 char*const char* 这是一个指针转换,但从 lvalueconst lvalue,它实际上不是转换。通过 const 引用添加 const 会被重载解析忽略,除非两个函数都具有上述情况的引用参数。

关于c++ - C++中的模板函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37373851/

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