为什么 const char[] 的类型推导与 const char * 不同?

BAK*_* ZQ 7 c++ arrays templates constants

在第一次调用中,当我将 a 传递给char const []一个参数为 的模板函数时T const aT推断出char const *这是合理的,因为const指的是衰减指针。

但是,当参数类型更改为 时T const & aT推导为char[7]。从上面的角度来看,为什么不const限定整个数组类型?

template <typename T>
void show1(T const a) {
     // input is const char *
     // T is char const *
     // a is char const * const
}

template <typename T>
void show2(T const & a) {
     // input is char const [7]
     // T is char[7]
     // a is char const (&)[7]
}

int main() {
    const char s[] = "asdasd";
    show1(s);
    show2(s);
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 4

为什么不限定const整个数组类型

因为对于数组类型

(强调我的)

将cv 限定符应用于数组类型(通过 typedef 或模板类型操作)会将限定符应用于元素 type,但其元素为 cv 限定类型的任何数组类型都被视为具有相同的 cv 限定。

// a and b have the same const-qualified type "array of 5 const char"
typedef const char CC;
CC a[5] = {}; 
typedef char CA[5];
const CA b = {};
Run Code Online (Sandbox Code Playgroud)

这意味着当Tischar[7] T const导致类型时char const[7],则T const&(即a类型)是char const (&)[7]

另一方面,当您传递stype数组时const char[7],该数组也被视为 const 限定的。因此,给定参数类型T const&T被推导为char[7]( 但不是char const[7])。