为什么模板类型参数不推断为"const"?

Why aren't template type parameters inferred as 'const'?

本文关键字:const 类型参数 为什么      更新时间:2023-10-16

可能的重复项:
从右值参数推断对常量的引用

如果我有

template<class T>
void foo(T &) { }

我称之为foo((const int)5),既然参数是const int,编译器为什么不自动推断Tconst int

根据C++03标准条款2.12.1.2,整数文字的类型是int,而不是const int

整数文本的类型取决于其形式、值和后缀。 如果它是十进制且没有后缀,则它具有以下类型中的第一个 其值可以表示:int,long int;...

更新

另一个相关的类型扣除规则可能是 14.8.2.1.2。

如果 P 不是引用类型:

[...]

— 如果 A 是符合 cv 标准的类型,则 A 类型的顶级 cv 限定符 对于类型推断,将忽略。

如果 P 是符合 cv 标准的类型,则 P 类型的顶级 cv 限定符 对于类型推断,将忽略。

如果 P 是引用类型

,则 P 引用的类型用于类型 演绎。

OP 提供的代码甚至不会编译,因为将非常量引用绑定到 rvalue 是非法的。

如果给定一个 const 类型,它确实如此。 右值(C++11 中的值)与然而,非类类型永远不符合 CV 资格,即使您试图说它们是:表达式((const int)5)的类型为 int 。 推理以下是简历资格仅适用于对象和临时对象非类类型不是对象,而是纯值;简历资格不能申请,因为没有什么可constvolatile的。

如果你写:

int const i = 42;
foo( i );

,您的模板将使用 T = int const 进行实例化。 (正如你写了它,代码不应该编译,因为推导的类型是int,所以函数取一个int&,这不能用右值初始化。