字符串字面值的模板参数推导

4
考虑这个简单的函数。
template<typename T>
void func(const T& x) {std::cout<< typeid(T).name();}

现在如果我调用函数 func("ddd")T 推断出什么?如果 func 的参数中没有 constT 将简单地是 char [4]。令人困惑的是添加了 const,那么 T 推断出什么呢?

是这样吗:const char [4]。如果我将参数改为 T const &x(即更改 const 的顺序),那么推导会将 T 推导为 char const [4] 吗?

有谁能解释一下带有字符串字面值的参数推导吗?


2
如果您调用func(),我猜您会得到一个编译错误,因为func需要一个参数。 - Didier Trosset
4
FYI,“const char [4]”和“char const [4]”是同一种类型。 - Unda
3个回答

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;
}

"char const (&)[4],const char [4]和char const [4]都是相同的类型!"--其中三个是引用类型。 - eerorika

0
如果我调用函数func(),T会推断为什么?
如果您使用字符串字面值调用,则T将推断为char const[N]。
如果func的参数中没有const,那么T将简单地是char [4]
如果您的意思是如果您将参数声明为T&x,则不:如果您使用字符串字面值调用,则T仍将被推断为char const[N]。
如果您的意思是使用非const数组调用func,则是的:T将被推断为非const。
如果我将参数更改为T const & x
这并没有改变任何东西,因为const T&是另一种写法T const&。

0

const 通常指的是它前面的内容:

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

char * const -- 常量指针,指向字符

char const * const -- 常量指针,指向常量字符

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

等等。

这个 leadingconst 是一个 exception,可以追溯到 C 早期:

const char * <=> char const *

因此,在模板中改变顺序不会改变类型(T const & <=> const T &)。

如果你想在 const 放置上保持一致,那么只使用尾随类型,因为这是唯一一种可以一致放置 const 的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接