在C ++中,如果我有一个通用函数:
template <typename T>
void func(T& s)
{
std::cout << "in generic\n";
std::cout << typeid(s).name();
}
T
将推断为typeid(s).name()
。
但是,如果我这样做:
func("test");
这个泛型函数有效,但这个没有:
void func(const char*& s)
{
std::cout << "in overloaded\n";
std::cout << typeid(s).name();
}
我知道如果我在重载函数的签名中将const char*&
更改为const char*
或const char* const&
,并且如果我想传递一个重载函数的参数必须是非临时的。我只是不明白T&
发生了什么,扣除后是否应该变成const char*&
?
答案 0 :(得分:4)
字符串文字是const字符的数组。所以在模板函数的情况下调用如下:
func("test");
T
推断为char const[5]
。 s
是对字符串文字的引用,其类型为char const (&)[5]
。也就是说,引用了5个const char的数组。
答案 1 :(得分:4)
"test"
的类型为const char[5]
。在调用函数模板并使用参数推导出引用类型的参数时,数组到指针的转换不会发生 。因此,通用函数将T
推导为const char[5]
- 您可以看到"test"
和const char*
的输出不同:
template<typename T>
void func(T& s){
std::cout << "in generic\n";
std::cout << typeid(s).name() << '\n';
}
int main()
{
func("test");
const char *c = "test";
func(c);
}
in generic
A5_c
in generic
PKc
另一方面,在非泛型函数中,您需要引用指向const char
的非const指针。但是,由于"test"
的类型为const char[5]
,因此必须进行数组到指针的转换,这意味着生成的const char*
是临时 ( rvalue )。因此,它无法绑定到对非const的引用。