Yes, it is a non-type parameter. You can have several kinds of template parameters
- Type Parameters.
- Types
- Templates (only classes, no functions)
- Non-type Parameters
- Pointers
- References
- Integral constant expressions
What you have there is of the last kind. It's a compile time constant (so-called constant expression) and is of type integer or enumeration. After looking it up in the standard, i had to move class templates up into the types section - even though templates are not types. But they are called type-parameters for the purpose of describing those kinds nonetheless. You can have pointers (and also member pointers) and references to objects/functions that have external linkage (those that can be linked to from other object files and whose address is unique in the entire program). Examples:
Template type parameter:
Template integer parameter:
Template pointer parameter (passing a pointer to a function)
Template reference parameter (passing an integer)
Template template parameter.
A template without any parameters is not possible. But a template without any explicit argument is possible - it has default arguments:
Syntactically, is reserved to mark an explicit template specialization, instead of a template without parameters: