A trailing template parameter pack ([temp.variadic]) not otherwise deduced will be
deduced as an empty sequence of template arguments.
If all of the template arguments can be deduced, they may all be omitted;
in this case, the empty template argument list
<>
itself may also be omitted. "
(emphasis mine)
Note carefully, in the last statement it says that when all of the template arguments can be deduced then they may all be omitted and in this case the empty <> itself may also be omitted. This is an issue because it does not mention that we can also omit the empty <> when all of the template arguments can be obtained from the default template arguments. Since deducing arguments and using default values are two different things, there should be a separate mention of the latter.
Only in the first sentence(quoted above) there is a mention of default template arguments but that is only in the context of the list of explicit template arguments.
This means according to the current wording(sentence 3 quoted above) the following should be invalid:
template<typename T = int>
void func()
{
}
int main()
{
func(); //this should be invalid according to the current wording
}
But we know that the above is not invalid and so there should be changes made to the sentence 3 quoted above to include the case of default template arguments.
Resolution:
The simplest resolution is to change the 3rd sentence quoted above to the following:
If all of the template arguments can be deduced or obtained from default template arguments, they may all be omitted;
in this case, the empty template argument list
<>
itself may also be omitted.
(end resolution)
I have highlighted the addition/change that i made in the above sentence to make it more clear/easily visible.