为什么模板类型参数不推断为"const"?
Why aren't template type parameters inferred as 'const'?
可能的重复项:
从右值参数推断对常量的引用
如果我有
template<class T>
void foo(T &) { }
我称之为foo((const int)5)
,既然参数是const int
,编译器为什么不自动推断T
是const 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
。 推理以下是简历资格仅适用于对象和临时对象非类类型不是对象,而是纯值;简历资格不能申请,因为没有什么可const
或volatile
的。
如果你写:
int const i = 42;
foo( i );
,您的模板将使用 T = int const
进行实例化。 (正如你写了它,代码不应该编译,因为推导的类型是int
,所以函数取一个int&
,这不能用右值初始化。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 为什么模板类型参数不推断为"const"?
- 使用const char*作为非类型参数的模板技巧