Inc*_*ble 7 c++ templates language-lawyer c++14
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);
Run Code Online (Sandbox Code Playgroud)
问题:为什么不h(const int, const int*)呢?
从什么知道,Z = const int所以Z模板声明中的每个出现都可以被读作const int,或者我错过了什么?为什么指针不同?我记得当参数有T&或T*它保留了cv-qualifiers时T,但我认为没有任何可能在这里应用它.
Nat*_*ica 11
您需要查看[dcl.fct]/5,原因如下:
单个名称可用于单个范围内的多个不同功能; 这是函数重载(第13条).函数的所有声明都应在return类型和parameter-type-list中完全一致.使用以下规则确定函数的类型.每个参数的类型(包括函数参数包)由其自己的decl-specifier-seq和声明符确定.在确定每个参数的类型之后,将"T数组"或"函数返回T"类型的任何参数分别调整为"指向T的指针"或"指向函数返回T的指针".生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级cv限定符.生成的已转换参数类型列表以及省略号或函数参数包的存在与否是函数的parameter-type-list.[注意:此转换不会影响参数的类型.例如,int()(const int p,decltype(p))和int()(int,const int)是相同的类型. - 尾注]
并且const type* const中不是顶级const限定符.
Sto*_*ica 10
原因是另一个标准段落:
单个名称可用于单个范围内的多个不同功能; 这是函数重载.函数的所有声明都应在return类型和parameter-type-list中完全一致.使用以下规则确定函数的类型.每个参数的类型(包括函数参数包)由其自己的decl-specifier-seq和声明符确定.在确定每个参数的类型之后,将"T数组"或函数类型T的任何参数调整为"指向T的指针".生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级cv限定符.生成的已转换参数类型列表以及省略号或函数参数包的存在与否是函数的parameter-type-list.[注意:此转换不会影响参数的类型.例如,int()(const int p,decltype(p))和int()(int,const int)是相同的类型. - 结束说明]
对此的合理化是,对于调用者,如果参数是cv-qualified,则没有区别; 调用函数的步骤以及重载决策的转换序列是相同的.因此,保留const实际上可能导致歧义.
cv-qualifier实际上是函数的实现细节,并且仅在函数定义的位置具有意义(您将无法修改函数体内的参数).