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

Ami*_*mir 2 c++ templates constants template-argument-deduction

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

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));
}
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下:

PKi
void fn(const T &&) [T = const int *]
PKi
Run Code Online (Sandbox Code Playgroud)

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

son*_*yao 5

在参数声明 中T const &&tconst被限定为T,即被t声明为 的右值引用const T

当传递arwith 类型时,被推导为,则 的类型将为,即指向 的指针的右值引用。请注意,s 在不同的事物(不同级别)上进行限定,一种用于指针,一种用于受指点。const int *Tconst int *tconst int * const &&constconst intconst