我正在阅读模板中的类型推导,这是一个困扰我的问题
template<typename T>
void funt(T const &t);
int x = 10;
func(x);
T
将被推断为 const int
,t
的类型将是 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
被推导出为 int
,x
的 const
被省略了
还是我在这里遗漏了什么?
最佳答案
类型推导规则不是很简单。但作为一般经验法则,有 3 种主要的类型推导情况:
-
f(/*const volatile*/ T& arg)
- 在这种情况下,编译器对参数执行类似于“模式匹配”的操作以推断类型T
.在你的第二种情况下,它完全匹配你的参数类型,即int const
, 与T const
,因此T
推导为int
.如果参数缺少 CV 限定符,就像在您的第一个示例中一样,那么编译器不会在模式匹配中考虑它们。所以,当你通过例如一个int x
至f(const T& param)
, 然后const
在模式匹配和T
期间被丢弃推导为int
,因此f
被实例化为f(const int&)
. -
f(/*const volatile*/ T arg)
-cv
-ness (const/volatile) 和参数的引用 -ness 被忽略。所以如果你有类似const int& x = otherx;
的东西并通过x
至template<class T> void f(T param)
, 然后T
推导为int
. -
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/