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

标签 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));
}

我得到的结果如下:

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

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

最佳答案

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

当传递 const int * 类型的 ar 时,T 被推导为 const int *,然后t 的类型将为 const int * const &&,即对 const 指针的右值引用,该指针指向 const int >。请注意,const 在不同的事物上(不同级别)进行限定,一个用于指针,一个用于指针接收者。

关于c++ - 将 `T const &&t` 与 `int const *` 匹配时 C++ 模板函数参数推导的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71555055/

相关文章:

r - 我可以使用R属性来保存物理单位吗?

c++ - 在运行时在 C++ 中组合几个类的类

C 存储大小不是常量...为什么?

c++ - 根据条件将基类指针转换为几种可能的派生类型指针之一

c++ - 如何旋转树或 AVL 树?

c++ - 模板<int v>类Foo的父类(super class)

自定义模板类的 C++ 迭代器

ruby - 警告 : already initialized

c++ - 尝试从其自己的类访问公共(public)变量时出现奇怪的 SIGSEGV

c++ - 将源代码从 window 转换为 linux