I'm struggling to understand this rule, specially the sentences in bold below (my emphasis):
Consider the comment #2 in the snippet below: what does it mean to say that the function type is f(int)
, but t
is const
?
§14.8.2/3
:After this substitution is performed, the function parameter type adjustments described in 8.3.5 are performed. [ Example: A parameter type of “
void ()(const int, int[5])
” becomes “void(*)(int,int*)
”. —end example ] [ Note: A top-level qualifier in a function parameter declaration does not affect the function type but still affects the type of the function parameter variable within the function. —end note ] [ Example:template <class T> void f(T t); template <class X> void g(const X x); template <class Z> void h(Z, Z*); int main() { // #1: function type is f(int), t is non const f<int>(1); // #2: function type is f(int), t is const f<const int>(1); // #3: function type is g(int), x is const g<int>(1); // #4: function type is g(int), x is const g<const int>(1); // #5: function type is h(int, const int*) h<const int>(1,0);
}
—end example ]
§14.8.2/4
:[ Note:
f<int>(1)
andf<const int>(1)
call distinct functions even though both of the functions called have the same function type. —end note ]