Files
cppdraft_translate/cppdraft/gram/temp.md
2025-10-25 03:02:53 +03:00

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-name:
identifier

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 ;

concept-name:
identifier

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

explicit-instantiation:
externopt template declaration

explicit-specialization:
template < > declaration