N3690,§ 14.8.2 第 3 段有一个令人兴奋的例子:
template <class Z> void h(Z, Z*);
// #5: function type is h(int, const int*)
h<const int>(1,0);
问题:为什么不是h(const int, const int*)
?
据了解,Z = const int
,所以每次出现Z
模板声明中可以读作const int
,或者我错过了什么?为什么指针不同?我记得当参数有T&
or T*
它保留了简历限定符T
,但我认为没有任何可能在这里应用它。
您需要查看 [dcl.fct]/5,原因如下:
单个名称可以在单个范围内用于多个不同的函数;这就是函数重载(第 13 条)。函数的所有声明在返回类型和参数类型列表中都应完全一致。函数的类型是使用以下规则确定的。每个参数(包括函数参数包)的类型由其自己的 decl-specifier-seq 和 declarator 确定。在确定每个参数的类型之后,任何“T的数组”或“返回T的函数”类型的参数分别被调整为“指向T的指针”或“指向返回T的函数的指针”。生成参数类型列表后,任何修改参数类型的顶级 cv 限定符在形成函数类型时都会被删除。转换后的参数类型的结果列表以及省略号或函数参数包的存在或不存在是函数的参数类型列表。 [ 注意:此转换不会影响参数的类型。例如,整数()(const int p, decltype(p)) 和 int()(int, 常量 int) 是相同的类型。 ——尾注]
And in const type*
const 不是顶级 const 限定符 https://stackoverflow.com/questions/7914444/what-are-top-level-const-qualifiers.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)