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

35 KiB

[gram.expr]

Annex A (informative) Grammar summary [gram]

A.5 Expressions [gram.expr]

primary-expression:
literal
this
( expression )
id-expression
lambda-expression
fold-expression
requires-expression
splice-expression

id-expression:
unqualified-id
qualified-id
pack-index-expression

unqualified-id:
identifier
operator-function-id
conversion-function-id
literal-operator-id
~ type-name
~ computed-type-specifier
template-id

qualified-id:
nested-name-specifier templateopt unqualified-id

nested-name-specifier:
::
type-name ::
namespace-name ::
computed-type-specifier ::
splice-scope-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::

splice-scope-specifier:
splice-specifier
templateopt splice-specialization-specifier

pack-index-expression:
id-expression ... [ constant-expression ]

lambda-expression:
lambda-introducer attribute-specifier-seqopt lambda-declarator compound-statement
lambda-introducer < template-parameter-list > requires-clauseopt attribute-specifier-seqopt
lambda-declarator compound-statement

lambda-introducer:
[ lambda-captureopt ]

lambda-declarator:
lambda-specifier-seq noexcept-specifieropt attribute-specifier-seqopt trailing-return-typeopt
function-contract-specifier-seqopt
noexcept-specifier attribute-specifier-seqopt trailing-return-typeopt function-contract-specifier-seqopt
trailing-return-typeopt function-contract-specifier-seqopt
( parameter-declaration-clause ) lambda-specifier-seqopt noexcept-specifieropt attribute-specifier-seqopt
trailing-return-typeopt requires-clauseopt function-contract-specifier-seqopt

lambda-specifier:
consteval
constexpr
mutable
static

lambda-specifier-seq:
lambda-specifier lambda-specifier-seqopt

lambda-capture:
capture-default
capture-list
capture-default , capture-list

capture-default:
&

capture-list:
capture
capture-list , capture

capture:
simple-capture
init-capture

simple-capture:
identifier ...opt
& identifier ...opt
this

  • this

init-capture:
...opt identifier initializer
& ...opt identifier initializer

fold-expression:
( cast-expression fold-operator ... )
( ... fold-operator cast-expression )
( cast-expression fold-operator ... fold-operator cast-expression )

fold-operator: one of

      • / % ^ & | << >>
        += -= = /= %= ^= &= |= <<= >>= =
        == != < > <= >= && || , .
        ->*

requires-expression:
requires requirement-parameter-listopt requirement-body

requirement-parameter-list:
( parameter-declaration-clause )

requirement-body:
{ requirement-seq }

requirement-seq:
requirement requirement-seqopt

requirement:
simple-requirement
type-requirement
compound-requirement
nested-requirement

simple-requirement:
expression ;

type-requirement:
typename nested-name-specifieropt type-name ;
typename splice-specifier
typename splice-specialization-specifier

compound-requirement:
{ expression } noexceptopt return-type-requirementopt ;

return-type-requirement:
-> type-constraint

nested-requirement:
requires constraint-expression ;

splice-expression:
splice-specifier
template splice-specifier
template splice-specialization-specifier

postfix-expression:
primary-expression
postfix-expression [ expression-listopt ]
postfix-expression ( expression-listopt )
simple-type-specifier ( expression-listopt )
typename-specifier ( expression-listopt )
simple-type-specifier braced-init-list
typename-specifier braced-init-list
postfix-expression . templateopt id-expression
postfix-expression . splice-expression
postfix-expression -> templateopt id-expression
postfix-expression -> splice-expression
postfix-expression ++
postfix-expression --
dynamic_cast < type-id > ( expression )
static_cast < type-id > ( expression )
reinterpret_cast < type-id > ( expression )
const_cast < type-id > ( expression )
typeid ( expression )
typeid ( type-id )

expression-list:
initializer-list

unary-expression:
postfix-expression
unary-operator cast-expression
++ cast-expression
-- cast-expression
await-expression
sizeof unary-expression
sizeof ( type-id )
sizeof ... ( identifier )
alignof ( type-id )
noexcept-expression
new-expression
delete-expression
reflect-expression

unary-operator: one of

  • & + - ! ~

await-expression:
co_await cast-expression

noexcept-expression:
noexcept ( expression )

new-expression:
::opt new new-placementopt new-type-id new-initializeropt
::opt new new-placementopt ( type-id ) new-initializeropt

new-placement:
( expression-list )

new-type-id:
type-specifier-seq new-declaratoropt

new-declarator:
ptr-operator new-declaratoropt
noptr-new-declarator

noptr-new-declarator:
[ expressionopt ] attribute-specifier-seqopt
noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt

new-initializer:
( expression-listopt )
braced-init-list

delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression

reflect-expression:
^^ ::
^^ reflection-name
^^ type-id
^^ id-expression

reflection-name:
nested-name-specifieropt identifier
nested-name-specifier template identifier

cast-expression:
unary-expression
( type-id ) cast-expression

pm-expression:
cast-expression
pm-expression .* cast-expression
pm-expression ->* cast-expression

multiplicative-expression:
pm-expression
multiplicative-expression * pm-expression
multiplicative-expression / pm-expression
multiplicative-expression % pm-expression

additive-expression:
multiplicative-expression
additive-expression + multiplicative-expression
additive-expression - multiplicative-expression

shift-expression:
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression

compare-expression:
shift-expression
compare-expression <=> shift-expression

relational-expression:
compare-expression
relational-expression < compare-expression
relational-expression > compare-expression
relational-expression <= compare-expression
relational-expression >= compare-expression

equality-expression:
relational-expression
equality-expression == relational-expression
equality-expression != relational-expression

and-expression:
equality-expression
and-expression & equality-expression

exclusive-or-expression:
and-expression
exclusive-or-expression ^ and-expression

inclusive-or-expression:
exclusive-or-expression
inclusive-or-expression | exclusive-or-expression

logical-and-expression:
inclusive-or-expression
logical-and-expression && inclusive-or-expression

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

conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression

yield-expression:
co_yield assignment-expression
co_yield braced-init-list

throw-expression:
throw assignment-expressionopt

assignment-expression:
conditional-expression
yield-expression
throw-expression
logical-or-expression assignment-operator initializer-clause

assignment-operator: one of
= *= /= %= += -= >>= <<= &= ^= |=

expression:
assignment-expression
expression , assignment-expression

constant-expression:
conditional-expression