Annex A (informative) Grammar summary [gram] (original) (raw)

A.11 Templates [gram.temp]

template-declaration:
template-head declaration
template-head concept-definition

template-head:
template < template-parameter-list > requires-clause

template-parameter-list:
template-parameter
template-parameter-list , template-parameter

requires-clause:
requires constraint-logical-or-expression

constraint-logical-or-expression:
constraint-logical-and-expression
constraint-logical-or-expression || constraint-logical-and-expression

constraint-logical-and-expression:
primary-expression
constraint-logical-and-expression && primary-expression

template-parameter:
type-parameter
parameter-declaration
type-tt-parameter
variable-tt-parameter
concept-tt-parameter

type-parameter:
type-parameter-key ... identifier
type-parameter-key identifier = type-id
type-constraint ... identifier
type-constraint identifier = type-id

type-parameter-key:
class
typename

type-constraint:
nested-name-specifier concept-name
nested-name-specifier concept-name < template-argument-list >

type-tt-parameter:
template-head type-parameter-key ... identifier
template-head type-parameter-key identifier type-tt-parameter-default

type-tt-parameter-default:
= nested-name-specifier template-name
= nested-name-specifier template template-name

variable-tt-parameter:
template-head auto ... identifier
template-head auto identifier = nested-name-specifier template-name

concept-tt-parameter:
template < template-parameter-list > concept ... identifier
template < template-parameter-list > concept identifier = nested-name-specifier template-name

simple-template-id:
template-name < template-argument-list >

template-id:
simple-template-id
operator-function-id < template-argument-list >
literal-operator-id < template-argument-list >

template-name:
identifier

template-argument-list:
template-argument ...
template-argument-list , template-argument ...

template-argument:
constant-expression
type-id
nested-name-specifier template-name
nested-name-specifier template template-name

constraint-expression:
logical-or-expression

deduction-guide:
explicit-specifier template-name ( parameter-declaration-clause ) -> simple-template-id requires-clause ;

concept-definition:
concept concept-name attribute-specifier-seq = constraint-expression ;

concept-name:
identifier

typename-specifier:
typename nested-name-specifier identifier
typename nested-name-specifier template simple-template-id

explicit-instantiation:
extern template declaration

explicit-specialization:
template < > declaration