将“T const &&t”与“int const *”匹配时的 C++ 模板函数参数推导说明

Explanation of the C++ template function argument deduction when matching `T const &&t` against `int const *`

我不明白在这种情况下参数推导规则是如何工作的。我有以下简单的代码片段:

template<typename T>
void fn(T const &&t) {
   std::cout << __PRETTY_FUNCTION__  << std::endl;
   std::cout << typeid(decltype(t)).name() << std::endl;
}
int main() {
   int const *ar = nullptr;
   std::cout << typeid(ar).name() << std::endl;
   fn(std::move(ar));
}

我得到的结果如下:

PKi
void fn(const T &&) [T = const int *]
PKi

我不明白的是为什么T被推断为const int *。为什么 const 没有匹配模式?

在参数声明 T const &&t 中,constT 上限定,即 t 被声明为 rvalue-reference 到 const T .

当传递 const int * 类型的 ar 时, T 被推导为 const int *,那么 t 的类型将是 const int * const &&,即 rvalue-reference 到 const 指向 const int 的指针。请注意,const 在不同的事物(在不同级别)上有资格,一种用于指针,一种用于指针。