12 KiB
[gram.temp]
Annex A (informative) Grammar summary [gram]
A.11 Templates [gram.temp]
template-declaration:
template-head declaration
template-head concept-definition
template-head:
template < template-parameter-list > requires-clauseopt
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 ...opt identifieropt
type-parameter-key identifieropt = type-id
type-constraint ...opt identifieropt
type-constraint identifieropt = type-id
type-parameter-key:
class
typename
type-constraint:
nested-name-specifieropt concept-name
nested-name-specifieropt concept-name < template-argument-listopt >
type-tt-parameter:
template-head type-parameter-key ...opt identifieropt
template-head type-parameter-key identifieropt type-tt-parameter-default
type-tt-parameter-default:
= nested-name-specifieropt template-name
= nested-name-specifier template template-name
variable-tt-parameter:
template-head auto ...opt identifieropt
template-head auto identifieropt = nested-name-specifieropt template-name
concept-tt-parameter:
template < template-parameter-list > concept ...opt identifieropt
template < template-parameter-list > concept identifieropt = nested-name-specifieropt template-name
simple-template-id:
template-name < template-argument-listopt >
template-id:
simple-template-id
operator-function-id < template-argument-listopt >
literal-operator-id < template-argument-listopt >
template-argument-list:
template-argument ...opt
template-argument-list , template-argument ...opt
template-argument:
constant-expression
type-id
nested-name-specifieropt template-name
nested-name-specifier template template-name
constraint-expression:
logical-or-expression
deduction-guide:
explicit-specifieropt template-name ( parameter-declaration-clause ) -> simple-template-id requires-clauseopt ;
concept-definition:
concept concept-name attribute-specifier-seqopt = constraint-expression ;
typename-specifier:
typename nested-name-specifier identifier
typename nested-name-specifier templateopt simple-template-id
explicit-instantiation:
externopt template declaration
explicit-specialization:
template < > declaration