Skip to content

The standard does not specify when to supply default arguments as template arguments #4082

Closed
@xmh0511

Description

@xmh0511
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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions