Files
2025-10-25 03:02:53 +03:00

108 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[gram.temp]
# Annex A (informative) Grammar summary [[gram]](./#gram)
## A.11 Templates [gram.temp]
[template-declaration:](temp.pre#nt:template-declaration "13.1Preamble[temp.pre]")
[*template-head*](temp.pre#nt:template-head "13.1Preamble[temp.pre]") [*declaration*](dcl.pre#nt:declaration "9.1Preamble[dcl.pre]")
[*template-head*](temp.pre#nt:template-head "13.1Preamble[temp.pre]") [*concept-definition*](temp.concept#nt:concept-definition "13.7.9Concept definitions[temp.concept]")
[template-head:](temp.pre#nt:template-head "13.1Preamble[temp.pre]")
template < [*template-parameter-list*](temp.pre#nt:template-parameter-list "13.1Preamble[temp.pre]") > [*requires-clause*](temp.pre#nt:requires-clause "13.1Preamble[temp.pre]")opt
[template-parameter-list:](temp.pre#nt:template-parameter-list "13.1Preamble[temp.pre]")
[*template-parameter*](temp.param#nt:template-parameter "13.2Template parameters[temp.param]")
[*template-parameter-list*](temp.pre#nt:template-parameter-list "13.1Preamble[temp.pre]") , [*template-parameter*](temp.param#nt:template-parameter "13.2Template parameters[temp.param]")
[requires-clause:](temp.pre#nt:requires-clause "13.1Preamble[temp.pre]")
requires [*constraint-logical-or-expression*](temp.pre#nt:constraint-logical-or-expression "13.1Preamble[temp.pre]")
[constraint-logical-or-expression:](temp.pre#nt:constraint-logical-or-expression "13.1Preamble[temp.pre]")
[*constraint-logical-and-expression*](temp.pre#nt:constraint-logical-and-expression "13.1Preamble[temp.pre]")
[*constraint-logical-or-expression*](temp.pre#nt:constraint-logical-or-expression "13.1Preamble[temp.pre]") || [*constraint-logical-and-expression*](temp.pre#nt:constraint-logical-and-expression "13.1Preamble[temp.pre]")
[constraint-logical-and-expression:](temp.pre#nt:constraint-logical-and-expression "13.1Preamble[temp.pre]")
[*primary-expression*](expr.prim.grammar#nt:primary-expression "7.5.1Grammar[expr.prim.grammar]")
[*constraint-logical-and-expression*](temp.pre#nt:constraint-logical-and-expression "13.1Preamble[temp.pre]") && [*primary-expression*](expr.prim.grammar#nt:primary-expression "7.5.1Grammar[expr.prim.grammar]")
[template-parameter:](temp.param#nt:template-parameter "13.2Template parameters[temp.param]")
[*type-parameter*](temp.param#nt:type-parameter "13.2Template parameters[temp.param]")
[*parameter-declaration*](dcl.fct#nt:parameter-declaration "9.3.4.6Functions[dcl.fct]")
[*type-tt-parameter*](temp.param#nt:type-tt-parameter "13.2Template parameters[temp.param]")
[*variable-tt-parameter*](temp.param#nt:variable-tt-parameter "13.2Template parameters[temp.param]")
[*concept-tt-parameter*](temp.param#nt:concept-tt-parameter "13.2Template parameters[temp.param]")
[type-parameter:](temp.param#nt:type-parameter "13.2Template parameters[temp.param]")
[*type-parameter-key*](temp.param#nt:type-parameter-key "13.2Template parameters[temp.param]") ...opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt
[*type-parameter-key*](temp.param#nt:type-parameter-key "13.2Template parameters[temp.param]") [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt = [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]")
[*type-constraint*](temp.param#nt:type-constraint "13.2Template parameters[temp.param]") ...opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt
[*type-constraint*](temp.param#nt:type-constraint "13.2Template parameters[temp.param]") [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt = [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]")
[type-parameter-key:](temp.param#nt:type-parameter-key "13.2Template parameters[temp.param]")
class
typename
[type-constraint:](temp.param#nt:type-constraint "13.2Template parameters[temp.param]")
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*concept-name*](temp.concept#nt:concept-name "13.7.9Concept definitions[temp.concept]")
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*concept-name*](temp.concept#nt:concept-name "13.7.9Concept definitions[temp.concept]") < [*template-argument-list*](temp.names#nt:template-argument-list "13.3Names of template specializations[temp.names]")opt >
[type-tt-parameter:](temp.param#nt:type-tt-parameter "13.2Template parameters[temp.param]")
[*template-head*](temp.pre#nt:template-head "13.1Preamble[temp.pre]") [*type-parameter-key*](temp.param#nt:type-parameter-key "13.2Template parameters[temp.param]") ...opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt
[*template-head*](temp.pre#nt:template-head "13.1Preamble[temp.pre]") [*type-parameter-key*](temp.param#nt:type-parameter-key "13.2Template parameters[temp.param]") [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt [*type-tt-parameter-default*](temp.param#nt:type-tt-parameter-default "13.2Template parameters[temp.param]")
[type-tt-parameter-default:](temp.param#nt:type-tt-parameter-default "13.2Template parameters[temp.param]")
= [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]")
= [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]") template [*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]")
[variable-tt-parameter:](temp.param#nt:variable-tt-parameter "13.2Template parameters[temp.param]")
[*template-head*](temp.pre#nt:template-head "13.1Preamble[temp.pre]") auto ...opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt
[*template-head*](temp.pre#nt:template-head "13.1Preamble[temp.pre]") auto [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt = [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]")
[concept-tt-parameter:](temp.param#nt:concept-tt-parameter "13.2Template parameters[temp.param]")
template < [*template-parameter-list*](temp.pre#nt:template-parameter-list "13.1Preamble[temp.pre]") > concept ...opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt
template < [*template-parameter-list*](temp.pre#nt:template-parameter-list "13.1Preamble[temp.pre]") > concept [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt = [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]")
[simple-template-id:](temp.names#nt:simple-template-id "13.3Names of template specializations[temp.names]")
[*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]") < [*template-argument-list*](temp.names#nt:template-argument-list "13.3Names of template specializations[temp.names]")opt >
[template-id:](temp.names#nt:template-id "13.3Names of template specializations[temp.names]")
[*simple-template-id*](temp.names#nt:simple-template-id "13.3Names of template specializations[temp.names]")
[*operator-function-id*](over.oper.general#nt:operator-function-id "12.4.1General[over.oper.general]") < [*template-argument-list*](temp.names#nt:template-argument-list "13.3Names of template specializations[temp.names]")opt >
[*literal-operator-id*](over.literal#nt:literal-operator-id "12.6User-defined literals[over.literal]") < [*template-argument-list*](temp.names#nt:template-argument-list "13.3Names of template specializations[temp.names]")opt >
[template-name:](temp.names#nt:template-name "13.3Names of template specializations[temp.names]")
[*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")
[template-argument-list:](temp.names#nt:template-argument-list "13.3Names of template specializations[temp.names]")
[*template-argument*](temp.names#nt:template-argument "13.3Names of template specializations[temp.names]") ...opt
[*template-argument-list*](temp.names#nt:template-argument-list "13.3Names of template specializations[temp.names]") , [*template-argument*](temp.names#nt:template-argument "13.3Names of template specializations[temp.names]") ...opt
[template-argument:](temp.names#nt:template-argument "13.3Names of template specializations[temp.names]")
[*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]")
[*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]")
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]")
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]") template [*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]")
[constraint-expression:](temp.constr.decl#nt:constraint-expression "13.5.3Constrained declarations[temp.constr.decl]")
[*logical-or-expression*](expr.log.or#nt:logical-or-expression "7.6.15Logical OR operator[expr.log.or]")
[deduction-guide:](temp.deduct.guide#nt:deduction-guide "13.7.2.3Deduction guides[temp.deduct.guide]")
[*explicit-specifier*](dcl.fct.spec#nt:explicit-specifier "9.2.3Function specifiers[dcl.fct.spec]")opt [*template-name*](temp.names#nt:template-name "13.3Names of template specializations[temp.names]") ( [*parameter-declaration-clause*](dcl.fct#nt:parameter-declaration-clause "9.3.4.6Functions[dcl.fct]") ) -> [*simple-template-id*](temp.names#nt:simple-template-id "13.3Names of template specializations[temp.names]") [*requires-clause*](temp.pre#nt:requires-clause "13.1Preamble[temp.pre]")opt ;
[concept-definition:](temp.concept#nt:concept-definition "13.7.9Concept definitions[temp.concept]")
concept [*concept-name*](temp.concept#nt:concept-name "13.7.9Concept definitions[temp.concept]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt = [*constraint-expression*](temp.constr.decl#nt:constraint-expression "13.5.3Constrained declarations[temp.constr.decl]") ;
[concept-name:](temp.concept#nt:concept-name "13.7.9Concept definitions[temp.concept]")
[*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")
[typename-specifier:](temp.res.general#nt:typename-specifier "13.8.1General[temp.res.general]")
typename [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]") [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")
typename [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]") templateopt [*simple-template-id*](temp.names#nt:simple-template-id "13.3Names of template specializations[temp.names]")
[explicit-instantiation:](temp.explicit#nt:explicit-instantiation "13.9.3Explicit instantiation[temp.explicit]")
externopt template [*declaration*](dcl.pre#nt:declaration "9.1Preamble[dcl.pre]")
[explicit-specialization:](temp.expl.spec#nt:explicit-specialization "13.9.4Explicit specialization[temp.expl.spec]")
template < > [*declaration*](dcl.pre#nt:declaration "9.1Preamble[dcl.pre]")