Annex A (informative) Grammar summary [gram]

A.4 Expressions [gram.expr]

primary-expression:
literal
this
( expression )
id-expression
lambda-expression
fold-expression
requires-expression
id-expression:
unqualified-id
qualified-id
unqualified-id:
identifier
operator-function-id
conversion-function-id
literal-operator-id
~ type-name
~ decltype-specifier
template-id
qualified-id:
nested-name-specifier template unqualified-id
nested-name-specifier:
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier template simple-template-id ::
lambda-expression:
lambda-introducer lambda-declarator compound-statement
lambda-introducer < template-parameter-list > requires-clause lambda-declarator compound-statement
lambda-introducer:
[ lambda-capture ]
lambda-declarator:
( parameter-declaration-clause ) decl-specifier-seq
   noexcept-specifier attribute-specifier-seq trailing-return-type requires-clause
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 ...
& identifier ...
this
* this
init-capture:
... identifier initializer
& ... 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-list requirement-body
requirement-parameter-list:
( parameter-declaration-clause )
requirement-body:
{ requirement-seq }
requirement-seq:
requirement
requirement-seq requirement
requirement:
simple-requirement
type-requirement
compound-requirement
nested-requirement
simple-requirement:
expression ;
type-requirement:
typename nested-name-specifier type-name ;
compound-requirement:
{ expression } noexcept return-type-requirement ;
return-type-requirement:
-> type-constraint
nested-requirement:
requires constraint-expression ;
postfix-expression:
primary-expression
postfix-expression [ expr-or-braced-init-list ]
postfix-expression ( expression-list )
simple-type-specifier ( expression-list )
typename-specifier ( expression-list )
simple-type-specifier braced-init-list
typename-specifier braced-init-list
postfix-expression . template id-expression
postfix-expression -> template id-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
unary-operator: one of
* & + - ! ~
await-expression:
co_await cast-expression
noexcept-expression:
noexcept ( expression )
new-expression:
:: new new-placement new-type-id new-initializer
:: new new-placement ( type-id ) new-initializer
new-placement:
( expression-list )
new-type-id:
type-specifier-seq new-declarator
new-declarator:
ptr-operator new-declarator
noptr-new-declarator
noptr-new-declarator:
[ expression ] attribute-specifier-seq
noptr-new-declarator [ constant-expression ] attribute-specifier-seq
new-initializer:
( expression-list )
braced-init-list
delete-expression:
:: delete cast-expression
:: delete [ ] cast-expression
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-expression
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