gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:33:57 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com