类型推导如何在C ++中用于字符串文字?

时间:2014-10-16 07:41:54

标签: c++ templates pointers type-deduction

在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*&

2 个答案:

答案 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);
}

GCC output:

in generic
A5_c
in generic
PKc

另一方面,在非泛型函数中,您需要引用指向const char的非const指针。但是,由于"test"的类型为const char[5],因此必须进行数组到指针的转换,这意味着生成的const char*临时 rvalue )。因此,它无法绑定到对非const的引用。