Description
template<typename T, typename U = T>
struct Test{};
template<typename T>
void func(Test<T> /*#1*/){
}
Consider the above code, at the point of #1
, Does the template-id Test<T>
require a template argument for corresponding template parameter U
? The only quote that mentioned default argument as template argument in the standard is the following :
When a simple-template-id does not name a function, a default template-argument is implicitly instantiated when the value of that default argument is needed. [ Example:
template<typename T, typename U = int> struct S { };
S* p; // the type of p is S<bool, int>*
The default argument for U is instantiated to form the type S<bool, int>*. — end example ]
However at the point of #1
, The specialization of Test<T>
is just a part of a function template definition, that is, there's no instantiation occurs here. So, the above quote seems to be not suitable for this case.
In the standard, there's a quote explicitly specified when to supply default arguments as arguments for function call, that is:
If an initializer-clause is specified in a parameter-declaration this initializer-clause is used as a default argument. Default arguments will be used in calls where trailing arguments are missing.
So, Is it necessary to formulate a formally terminology to cover this case? such as
A default template-argument is a template-argument ([temp.arg]) specified after = in a template-parameter. Default arguments will be used in template-id where trailing arguments are missing and the corresponding template parameter does not participate in template argument deduction.