字符串文字的模板参数推导

时间:2015-09-21 06:59:52

标签: c++

考虑这个简单的功能

template<typename T>
void func(const T& x) {std::cout<< typeid(T).name();}

现在,如果我调用函数func("ddd"),T会推导出什么? 。如果const的参数中没有func,则T只是char [4],让我感到困惑的是添加const,是什么T推断为?

是:const char [4]。如果我将参数更改为T const &x(即const的更改顺序),则扣除会产生Tchar const [4]吗?

任何人都可以用字符串文字解释参数演绎吗?

3 个答案:

答案 0 :(得分:1)

字符串文字是const字符的数组。

对4个字符串的字符串文字的引用属于char const (&)[4]类型。

const char [4]char const [4]属于同一类型!

char const (&)[N]const char [N]char const [N]全部推断为char const [N]

#include <iostream>

template<typename T>
void func1(T& x) {std::cout<< typeid(T).name()<<std::endl;}

template<typename T>
void func2(const T& x) {std::cout<< typeid(T).name()<<std::endl;}

template<typename T>
void func3(T const &x) {std::cout<< typeid(T).name()<<std::endl;}

int main()
{
    char c[4]= {'a','b','c','d'};
    const char c1[4]= {'a','b','c','d'};
    char const c2[4]= {'a','b','c','d'};

    func1("abcd"); //prints char const [4]
    func1(c); //prints char [4]
    func1(c1); //prints char const [4]
    func1(c2); //prints char const [4]

    func2("abcd"); //prints char const [4]
    func2(c); //prints char [4]
    func2(c1); //prints char const [4]
    func2(c2); //prints char const [4]

    func3("abcd"); //prints char const [4]
    func3(c); //prints char [4]
    func3(c1); //prints char const [4]
    func3(c2); //prints char const [4]

    return 0;
}

答案 1 :(得分:0)

  

现在如果我调用函数func(),T推导出什么?

如果您使用字符串文字调用,则T会推断为char const[N]

  

如果func参数中没有const,则T将只是char [4]

如果您的意思是如果您将参数声明为T& x,那么如果您使用字符串文字进行调用,则仍然会将T推断为char const[N]

如果你的意思是用非const数组调用func,那么是:T将推断为非const。

  

如果我将参数更改为T const&amp; x

这没有任何改变,因为const T &只是写T const &的另一种方式。

答案 2 :(得分:0)

const通常指的是前面的

char const * - 指向常量字符

的指针

char * const - 指向char的常量指针

char const * const - 指向常量char的常量指针

char Foo::bar() const - 常量成员函数返回char

前导 const是一个可以追溯到C早期的例外

const char *&lt; =&gt; char const *

因此,更改模板中的顺序根本不会更改类型(T const &&lt; =&gt; const T &)。

如果您想要一致关于const展示位置,请专门使用尾随类型,因为这是您 放置const的唯一方式一致。