c++ - 为什么为 T 推导的类型是 const int in void func(T const &t)

标签 c++ templates type-deduction

我正在阅读模板中的类型推导,这是一个困扰我的问题

template<typename T>
void funt(T const &t);
int x = 10;
func(x);

T 将被推断为 const intt 的类型将是 int const & 我理解为什么 t 必须是 int const & 的原因,这样传递给函数的 x 将保持不变,因为函数接受常量 T&。 但我不明白为什么 T 也必须是 const 的原因。在我看来,将 T 推导为 int 不会破坏这段代码中的任何内容? 就像另一个例子:

template<typename T>
void funt(T const &t);
int const x = 10;
func(x);

此处 T 被推导出为 intxconst 被省略了

还是我在这里遗漏了什么?

最佳答案

类型推导规则不是很简单。但作为一般经验法则,有 3 种主要的类型推导情况:

  1. f(/*const volatile*/ T& arg) - 在这种情况下,编译器对参数执行类似于“模式匹配”的操作以推断类型 T .在你的第二种情况下,它完全匹配你的参数类型,即 int const , 与 T const ,因此 T推导为 int .如果参数缺少 CV 限定符,就像在您的第一个示例中一样,那么编译器不会在模式匹配中考虑它们。所以,当你通过例如一个int xf(const T& param) , 然后 const在模式匹配和 T 期间被丢弃推导为 int ,因此 f被实例化为 f(const int&) .
  2. f(/*const volatile*/ T arg) - cv -ness (const/volatile) 和参数的引用 -ness 被忽略。所以如果你有类似 const int& x = otherx; 的东西并通过 xtemplate<class T> void f(T param) , 然后 T推导为 int .
  3. f(T&& arg) - T被推断为左值引用(如 int& )或右值(如 int ),取决于 arg 是否分别是左值或右值。这种情况有点复杂,我建议阅读更多有关转发引用和引用折叠规则的信息,以了解发生了什么。

Scott Meyers 在 Effective Modern C++ 的第 1 章中讨论了模板类型推导书很详细。那一章居然在线免费,看https://www.safaribooksonline.com/library/view/effective-modern-c/9781491908419/ch01.html .

关于c++ - 为什么为 T 推导的类型是 const int in void func(T const &t),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42421103/

相关文章:

c++ - 将临时对象作为对抽象的引用传递给构造函数

c++ - 如何消除模板代码中的 "divide by 0"错误

c++ - C++ 中的字符串文字的类型推导如何工作?

c++ - 是否可以使生成的 doxygen 输出看起来像 msdn 样式文档(可能是 sandcaSTLe 生成的)?

c++ - 如何将谓词传递给算法

c++ - static_cast<int>(var) 和 *(int*)&var 有什么区别?

c++ - basic_string<CharT> 与 CharT*

c++ - 如何防止模板类被多次派生?

C++ 模板交换函数

c++ - 为什么使用具有某些类型特征的模板类型会导致模板推导失败