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

323 lines
35 KiB
Markdown
Raw 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.expr]
# Annex A (informative) Grammar summary [[gram]](./#gram)
## A.5 Expressions [gram.expr]
[primary-expression:](expr.prim.grammar#nt:primary-expression "7.5.1Grammar[expr.prim.grammar]")
[*literal*](lex.literal.kinds#nt:literal "5.13.1Kinds of literals[lex.literal.kinds]")
this
( [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") )
[*id-expression*](expr.prim.id.general#nt:id-expression "7.5.5.1General[expr.prim.id.general]")
[*lambda-expression*](expr.prim.lambda.general#nt:lambda-expression "7.5.6.1General[expr.prim.lambda.general]")
[*fold-expression*](expr.prim.fold#nt:fold-expression "7.5.7Fold expressions[expr.prim.fold]")
[*requires-expression*](expr.prim.req.general#nt:requires-expression "7.5.8.1General[expr.prim.req.general]")
[*splice-expression*](expr.prim.splice#nt:splice-expression "7.5.9Expression splicing[expr.prim.splice]")
[id-expression:](expr.prim.id.general#nt:id-expression "7.5.5.1General[expr.prim.id.general]")
[*unqualified-id*](expr.prim.id.unqual#nt:unqualified-id "7.5.5.2Unqualified names[expr.prim.id.unqual]")
[*qualified-id*](expr.prim.id.qual#nt:qualified-id "7.5.5.3Qualified names[expr.prim.id.qual]")
[*pack-index-expression*](expr.prim.pack.index#nt:pack-index-expression "7.5.5.4Pack indexing expression[expr.prim.pack.index]")
[unqualified-id:](expr.prim.id.unqual#nt:unqualified-id "7.5.5.2Unqualified names[expr.prim.id.unqual]")
[*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")
[*operator-function-id*](over.oper.general#nt:operator-function-id "12.4.1General[over.oper.general]")
[*conversion-function-id*](class.conv.fct#nt:conversion-function-id "11.4.8.3Conversion functions[class.conv.fct]")
[*literal-operator-id*](over.literal#nt:literal-operator-id "12.6User-defined literals[over.literal]")
~ [*type-name*](dcl.type.simple#nt:type-name "9.2.9.3Simple type specifiers[dcl.type.simple]")
~ [*computed-type-specifier*](dcl.type.simple#nt:computed-type-specifier "9.2.9.3Simple type specifiers[dcl.type.simple]")
[*template-id*](temp.names#nt:template-id "13.3Names of template specializations[temp.names]")
[qualified-id:](expr.prim.id.qual#nt:qualified-id "7.5.5.3Qualified names[expr.prim.id.qual]")
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]") templateopt [*unqualified-id*](expr.prim.id.unqual#nt:unqualified-id "7.5.5.2Unqualified names[expr.prim.id.unqual]")
[nested-name-specifier:](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")
::
[*type-name*](dcl.type.simple#nt:type-name "9.2.9.3Simple type specifiers[dcl.type.simple]") ::
[*namespace-name*](namespace.def.general#nt:namespace-name "9.9.2.1General[namespace.def.general]") ::
[*computed-type-specifier*](dcl.type.simple#nt:computed-type-specifier "9.2.9.3Simple type specifiers[dcl.type.simple]") ::
[*splice-scope-specifier*](expr.prim.id.qual#nt:splice-scope-specifier "7.5.5.3Qualified names[expr.prim.id.qual]") ::
[*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]") ::
[*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]") ::
[splice-scope-specifier:](expr.prim.id.qual#nt:splice-scope-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")
[*splice-specifier*](basic.splice#nt:splice-specifier "6.6Splice specifiers[basic.splice]")
templateopt [*splice-specialization-specifier*](basic.splice#nt:splice-specialization-specifier "6.6Splice specifiers[basic.splice]")
[pack-index-expression:](expr.prim.pack.index#nt:pack-index-expression "7.5.5.4Pack indexing expression[expr.prim.pack.index]")
[*id-expression*](expr.prim.id.general#nt:id-expression "7.5.5.1General[expr.prim.id.general]") ... [ [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]") ]
[lambda-expression:](expr.prim.lambda.general#nt:lambda-expression "7.5.6.1General[expr.prim.lambda.general]")
[*lambda-introducer*](expr.prim.lambda.general#nt:lambda-introducer "7.5.6.1General[expr.prim.lambda.general]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt [*lambda-declarator*](expr.prim.lambda.general#nt:lambda-declarator "7.5.6.1General[expr.prim.lambda.general]") [*compound-statement*](stmt.block#nt:compound-statement "8.4Compound statement or block[stmt.block]")
[*lambda-introducer*](expr.prim.lambda.general#nt:lambda-introducer "7.5.6.1General[expr.prim.lambda.general]") < [*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 [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt
[*lambda-declarator*](expr.prim.lambda.general#nt:lambda-declarator "7.5.6.1General[expr.prim.lambda.general]") [*compound-statement*](stmt.block#nt:compound-statement "8.4Compound statement or block[stmt.block]")
[lambda-introducer:](expr.prim.lambda.general#nt:lambda-introducer "7.5.6.1General[expr.prim.lambda.general]")
[ [*lambda-capture*](expr.prim.lambda.capture#nt:lambda-capture "7.5.6.3Captures[expr.prim.lambda.capture]")opt ]
[lambda-declarator:](expr.prim.lambda.general#nt:lambda-declarator "7.5.6.1General[expr.prim.lambda.general]")
[*lambda-specifier-seq*](expr.prim.lambda.general#nt:lambda-specifier-seq "7.5.6.1General[expr.prim.lambda.general]") [*noexcept-specifier*](except.spec#nt:noexcept-specifier "14.5Exception specifications[except.spec]")opt [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt [*trailing-return-type*](dcl.decl.general#nt:trailing-return-type "9.3.1General[dcl.decl.general]")opt
[*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1General[dcl.contract.func]")opt
[*noexcept-specifier*](except.spec#nt:noexcept-specifier "14.5Exception specifications[except.spec]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt [*trailing-return-type*](dcl.decl.general#nt:trailing-return-type "9.3.1General[dcl.decl.general]")opt [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1General[dcl.contract.func]")opt
[*trailing-return-type*](dcl.decl.general#nt:trailing-return-type "9.3.1General[dcl.decl.general]")opt [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1General[dcl.contract.func]")opt
( [*parameter-declaration-clause*](dcl.fct#nt:parameter-declaration-clause "9.3.4.6Functions[dcl.fct]") ) [*lambda-specifier-seq*](expr.prim.lambda.general#nt:lambda-specifier-seq "7.5.6.1General[expr.prim.lambda.general]")opt [*noexcept-specifier*](except.spec#nt:noexcept-specifier "14.5Exception specifications[except.spec]")opt [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt
[*trailing-return-type*](dcl.decl.general#nt:trailing-return-type "9.3.1General[dcl.decl.general]")opt [*requires-clause*](temp.pre#nt:requires-clause "13.1Preamble[temp.pre]")opt [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1General[dcl.contract.func]")opt
[lambda-specifier:](expr.prim.lambda.general#nt:lambda-specifier "7.5.6.1General[expr.prim.lambda.general]")
consteval
constexpr
mutable
static
[lambda-specifier-seq:](expr.prim.lambda.general#nt:lambda-specifier-seq "7.5.6.1General[expr.prim.lambda.general]")
[*lambda-specifier*](expr.prim.lambda.general#nt:lambda-specifier "7.5.6.1General[expr.prim.lambda.general]") [*lambda-specifier-seq*](expr.prim.lambda.general#nt:lambda-specifier-seq "7.5.6.1General[expr.prim.lambda.general]")opt
[lambda-capture:](expr.prim.lambda.capture#nt:lambda-capture "7.5.6.3Captures[expr.prim.lambda.capture]")
[*capture-default*](expr.prim.lambda.capture#nt:capture-default "7.5.6.3Captures[expr.prim.lambda.capture]")
[*capture-list*](expr.prim.lambda.capture#nt:capture-list "7.5.6.3Captures[expr.prim.lambda.capture]")
[*capture-default*](expr.prim.lambda.capture#nt:capture-default "7.5.6.3Captures[expr.prim.lambda.capture]") , [*capture-list*](expr.prim.lambda.capture#nt:capture-list "7.5.6.3Captures[expr.prim.lambda.capture]")
[capture-default:](expr.prim.lambda.capture#nt:capture-default "7.5.6.3Captures[expr.prim.lambda.capture]")
&
=
[capture-list:](expr.prim.lambda.capture#nt:capture-list "7.5.6.3Captures[expr.prim.lambda.capture]")
[*capture*](expr.prim.lambda.capture#nt:capture "7.5.6.3Captures[expr.prim.lambda.capture]")
[*capture-list*](expr.prim.lambda.capture#nt:capture-list "7.5.6.3Captures[expr.prim.lambda.capture]") , [*capture*](expr.prim.lambda.capture#nt:capture "7.5.6.3Captures[expr.prim.lambda.capture]")
[capture:](expr.prim.lambda.capture#nt:capture "7.5.6.3Captures[expr.prim.lambda.capture]")
[*simple-capture*](expr.prim.lambda.capture#nt:simple-capture "7.5.6.3Captures[expr.prim.lambda.capture]")
[*init-capture*](expr.prim.lambda.capture#nt:init-capture "7.5.6.3Captures[expr.prim.lambda.capture]")
[simple-capture:](expr.prim.lambda.capture#nt:simple-capture "7.5.6.3Captures[expr.prim.lambda.capture]")
[*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") ...opt
& [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") ...opt
this
* this
[init-capture:](expr.prim.lambda.capture#nt:init-capture "7.5.6.3Captures[expr.prim.lambda.capture]")
...opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") [*initializer*](dcl.init.general#nt:initializer "9.5.1General[dcl.init.general]")
& ...opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") [*initializer*](dcl.init.general#nt:initializer "9.5.1General[dcl.init.general]")
[fold-expression:](expr.prim.fold#nt:fold-expression "7.5.7Fold expressions[expr.prim.fold]")
( [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]") [*fold-operator*](expr.prim.fold#nt:fold-operator "7.5.7Fold expressions[expr.prim.fold]") ... )
( ... [*fold-operator*](expr.prim.fold#nt:fold-operator "7.5.7Fold expressions[expr.prim.fold]") [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]") )
( [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]") [*fold-operator*](expr.prim.fold#nt:fold-operator "7.5.7Fold expressions[expr.prim.fold]") ... [*fold-operator*](expr.prim.fold#nt:fold-operator "7.5.7Fold expressions[expr.prim.fold]") [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]") )
[fold-operator:](expr.prim.fold#nt:fold-operator "7.5.7Fold expressions[expr.prim.fold]") one of
+ - * / % ^ & | << >>
+= -= *= /= %= ^= &= |= <<= >>= =
== != < > <= >= && || , .* ->*
[requires-expression:](expr.prim.req.general#nt:requires-expression "7.5.8.1General[expr.prim.req.general]")
requires [*requirement-parameter-list*](expr.prim.req.general#nt:requirement-parameter-list "7.5.8.1General[expr.prim.req.general]")opt [*requirement-body*](expr.prim.req.general#nt:requirement-body "7.5.8.1General[expr.prim.req.general]")
[requirement-parameter-list:](expr.prim.req.general#nt:requirement-parameter-list "7.5.8.1General[expr.prim.req.general]")
( [*parameter-declaration-clause*](dcl.fct#nt:parameter-declaration-clause "9.3.4.6Functions[dcl.fct]") )
[requirement-body:](expr.prim.req.general#nt:requirement-body "7.5.8.1General[expr.prim.req.general]")
{ [*requirement-seq*](expr.prim.req.general#nt:requirement-seq "7.5.8.1General[expr.prim.req.general]") }
[requirement-seq:](expr.prim.req.general#nt:requirement-seq "7.5.8.1General[expr.prim.req.general]")
[*requirement*](expr.prim.req.general#nt:requirement "7.5.8.1General[expr.prim.req.general]") [*requirement-seq*](expr.prim.req.general#nt:requirement-seq "7.5.8.1General[expr.prim.req.general]")opt
[requirement:](expr.prim.req.general#nt:requirement "7.5.8.1General[expr.prim.req.general]")
[*simple-requirement*](expr.prim.req.simple#nt:simple-requirement "7.5.8.2Simple requirements[expr.prim.req.simple]")
[*type-requirement*](expr.prim.req.type#nt:type-requirement "7.5.8.3Type requirements[expr.prim.req.type]")
[*compound-requirement*](expr.prim.req.compound#nt:compound-requirement "7.5.8.4Compound requirements[expr.prim.req.compound]")
[*nested-requirement*](expr.prim.req.nested#nt:nested-requirement "7.5.8.5Nested requirements[expr.prim.req.nested]")
[simple-requirement:](expr.prim.req.simple#nt:simple-requirement "7.5.8.2Simple requirements[expr.prim.req.simple]")
[*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") ;
[type-requirement:](expr.prim.req.type#nt:type-requirement "7.5.8.3Type requirements[expr.prim.req.type]")
typename [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*type-name*](dcl.type.simple#nt:type-name "9.2.9.3Simple type specifiers[dcl.type.simple]") ;
typename [*splice-specifier*](basic.splice#nt:splice-specifier "6.6Splice specifiers[basic.splice]")
typename [*splice-specialization-specifier*](basic.splice#nt:splice-specialization-specifier "6.6Splice specifiers[basic.splice]")
[compound-requirement:](expr.prim.req.compound#nt:compound-requirement "7.5.8.4Compound requirements[expr.prim.req.compound]")
{ [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") } noexceptopt [*return-type-requirement*](expr.prim.req.compound#nt:return-type-requirement "7.5.8.4Compound requirements[expr.prim.req.compound]")opt ;
[return-type-requirement:](expr.prim.req.compound#nt:return-type-requirement "7.5.8.4Compound requirements[expr.prim.req.compound]")
-> [*type-constraint*](temp.param#nt:type-constraint "13.2Template parameters[temp.param]")
[nested-requirement:](expr.prim.req.nested#nt:nested-requirement "7.5.8.5Nested requirements[expr.prim.req.nested]")
requires [*constraint-expression*](temp.constr.decl#nt:constraint-expression "13.5.3Constrained declarations[temp.constr.decl]") ;
[splice-expression:](expr.prim.splice#nt:splice-expression "7.5.9Expression splicing[expr.prim.splice]")
[*splice-specifier*](basic.splice#nt:splice-specifier "6.6Splice specifiers[basic.splice]")
template [*splice-specifier*](basic.splice#nt:splice-specifier "6.6Splice specifiers[basic.splice]")
template [*splice-specialization-specifier*](basic.splice#nt:splice-specialization-specifier "6.6Splice specifiers[basic.splice]")
[postfix-expression:](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]")
[*primary-expression*](expr.prim.grammar#nt:primary-expression "7.5.1Grammar[expr.prim.grammar]")
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") [ [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")opt ]
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") ( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")opt )
[*simple-type-specifier*](dcl.type.simple#nt:simple-type-specifier "9.2.9.3Simple type specifiers[dcl.type.simple]") ( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")opt )
[*typename-specifier*](temp.res.general#nt:typename-specifier "13.8.1General[temp.res.general]") ( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")opt )
[*simple-type-specifier*](dcl.type.simple#nt:simple-type-specifier "9.2.9.3Simple type specifiers[dcl.type.simple]") [*braced-init-list*](dcl.init.general#nt:braced-init-list "9.5.1General[dcl.init.general]")
[*typename-specifier*](temp.res.general#nt:typename-specifier "13.8.1General[temp.res.general]") [*braced-init-list*](dcl.init.general#nt:braced-init-list "9.5.1General[dcl.init.general]")
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") . templateopt [*id-expression*](expr.prim.id.general#nt:id-expression "7.5.5.1General[expr.prim.id.general]")
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") . [*splice-expression*](expr.prim.splice#nt:splice-expression "7.5.9Expression splicing[expr.prim.splice]")
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") -> templateopt [*id-expression*](expr.prim.id.general#nt:id-expression "7.5.5.1General[expr.prim.id.general]")
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") -> [*splice-expression*](expr.prim.splice#nt:splice-expression "7.5.9Expression splicing[expr.prim.splice]")
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") ++
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]") --
dynamic_cast < [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") > ( [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") )
static_cast < [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") > ( [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") )
reinterpret_cast < [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") > ( [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") )
const_cast < [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") > ( [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") )
typeid ( [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") )
typeid ( [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") )
[expression-list:](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")
[*initializer-list*](dcl.init.general#nt:initializer-list "9.5.1General[dcl.init.general]")
[unary-expression:](expr.unary.general#nt:unary-expression "7.6.2.1General[expr.unary.general]")
[*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1General[expr.post.general]")
[*unary-operator*](expr.unary.general#nt:unary-operator "7.6.2.1General[expr.unary.general]") [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
++ [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
-- [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[*await-expression*](expr.await#nt:await-expression "7.6.2.4Await[expr.await]")
sizeof [*unary-expression*](expr.unary.general#nt:unary-expression "7.6.2.1General[expr.unary.general]")
sizeof ( [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") )
sizeof ... ( [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") )
alignof ( [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") )
[*noexcept-expression*](expr.unary.noexcept#nt:noexcept-expression "7.6.2.7noexcept operator[expr.unary.noexcept]")
[*new-expression*](expr.new#nt:new-expression "7.6.2.8New[expr.new]")
[*delete-expression*](expr.delete#nt:delete-expression "7.6.2.9Delete[expr.delete]")
[*reflect-expression*](expr.reflect#nt:reflect-expression "7.6.2.10The reflection operator[expr.reflect]")
[unary-operator:](expr.unary.general#nt:unary-operator "7.6.2.1General[expr.unary.general]") one of
* & + - ! ~
[await-expression:](expr.await#nt:await-expression "7.6.2.4Await[expr.await]")
co_await [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[noexcept-expression:](expr.unary.noexcept#nt:noexcept-expression "7.6.2.7noexcept operator[expr.unary.noexcept]")
noexcept ( [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") )
[new-expression:](expr.new#nt:new-expression "7.6.2.8New[expr.new]")
::opt new [*new-placement*](expr.new#nt:new-placement "7.6.2.8New[expr.new]")opt [*new-type-id*](expr.new#nt:new-type-id "7.6.2.8New[expr.new]") [*new-initializer*](expr.new#nt:new-initializer "7.6.2.8New[expr.new]")opt
::opt new [*new-placement*](expr.new#nt:new-placement "7.6.2.8New[expr.new]")opt ( [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") ) [*new-initializer*](expr.new#nt:new-initializer "7.6.2.8New[expr.new]")opt
[new-placement:](expr.new#nt:new-placement "7.6.2.8New[expr.new]")
( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]") )
[new-type-id:](expr.new#nt:new-type-id "7.6.2.8New[expr.new]")
[*type-specifier-seq*](dcl.type.general#nt:type-specifier-seq "9.2.9.1General[dcl.type.general]") [*new-declarator*](expr.new#nt:new-declarator "7.6.2.8New[expr.new]")opt
[new-declarator:](expr.new#nt:new-declarator "7.6.2.8New[expr.new]")
[*ptr-operator*](dcl.decl.general#nt:ptr-operator "9.3.1General[dcl.decl.general]") [*new-declarator*](expr.new#nt:new-declarator "7.6.2.8New[expr.new]")opt
[*noptr-new-declarator*](expr.new#nt:noptr-new-declarator "7.6.2.8New[expr.new]")
[noptr-new-declarator:](expr.new#nt:noptr-new-declarator "7.6.2.8New[expr.new]")
[ [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]")opt ] [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt
[*noptr-new-declarator*](expr.new#nt:noptr-new-declarator "7.6.2.8New[expr.new]") [ [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]") ] [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt
[new-initializer:](expr.new#nt:new-initializer "7.6.2.8New[expr.new]")
( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")opt )
[*braced-init-list*](dcl.init.general#nt:braced-init-list "9.5.1General[dcl.init.general]")
[delete-expression:](expr.delete#nt:delete-expression "7.6.2.9Delete[expr.delete]")
::opt delete [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
::opt delete [ ] [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[reflect-expression:](expr.reflect#nt:reflect-expression "7.6.2.10The reflection operator[expr.reflect]")
^^ ::
^^ [*reflection-name*](expr.reflect#nt:reflection-name "7.6.2.10The reflection operator[expr.reflect]")
^^ [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]")
^^ [*id-expression*](expr.prim.id.general#nt:id-expression "7.5.5.1General[expr.prim.id.general]")
[reflection-name:](expr.reflect#nt:reflection-name "7.6.2.10The reflection operator[expr.reflect]")
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]")opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3Qualified names[expr.prim.id.qual]") template [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")
[cast-expression:](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[*unary-expression*](expr.unary.general#nt:unary-expression "7.6.2.1General[expr.unary.general]")
( [*type-id*](dcl.name#nt:type-id "9.3.2Type names[dcl.name]") ) [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[pm-expression:](expr.mptr.oper#nt:pm-expression "7.6.4Pointer-to-member operators[expr.mptr.oper]")
[*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[*pm-expression*](expr.mptr.oper#nt:pm-expression "7.6.4Pointer-to-member operators[expr.mptr.oper]") .* [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[*pm-expression*](expr.mptr.oper#nt:pm-expression "7.6.4Pointer-to-member operators[expr.mptr.oper]") ->* [*cast-expression*](expr.cast#nt:cast-expression "7.6.3Explicit type conversion (cast notation)[expr.cast]")
[multiplicative-expression:](expr.mul#nt:multiplicative-expression "7.6.5Multiplicative operators[expr.mul]")
[*pm-expression*](expr.mptr.oper#nt:pm-expression "7.6.4Pointer-to-member operators[expr.mptr.oper]")
[*multiplicative-expression*](expr.mul#nt:multiplicative-expression "7.6.5Multiplicative operators[expr.mul]") * [*pm-expression*](expr.mptr.oper#nt:pm-expression "7.6.4Pointer-to-member operators[expr.mptr.oper]")
[*multiplicative-expression*](expr.mul#nt:multiplicative-expression "7.6.5Multiplicative operators[expr.mul]") / [*pm-expression*](expr.mptr.oper#nt:pm-expression "7.6.4Pointer-to-member operators[expr.mptr.oper]")
[*multiplicative-expression*](expr.mul#nt:multiplicative-expression "7.6.5Multiplicative operators[expr.mul]") % [*pm-expression*](expr.mptr.oper#nt:pm-expression "7.6.4Pointer-to-member operators[expr.mptr.oper]")
[additive-expression:](expr.add#nt:additive-expression "7.6.6Additive operators[expr.add]")
[*multiplicative-expression*](expr.mul#nt:multiplicative-expression "7.6.5Multiplicative operators[expr.mul]")
[*additive-expression*](expr.add#nt:additive-expression "7.6.6Additive operators[expr.add]") + [*multiplicative-expression*](expr.mul#nt:multiplicative-expression "7.6.5Multiplicative operators[expr.mul]")
[*additive-expression*](expr.add#nt:additive-expression "7.6.6Additive operators[expr.add]") - [*multiplicative-expression*](expr.mul#nt:multiplicative-expression "7.6.5Multiplicative operators[expr.mul]")
[shift-expression:](expr.shift#nt:shift-expression "7.6.7Shift operators[expr.shift]")
[*additive-expression*](expr.add#nt:additive-expression "7.6.6Additive operators[expr.add]")
[*shift-expression*](expr.shift#nt:shift-expression "7.6.7Shift operators[expr.shift]") << [*additive-expression*](expr.add#nt:additive-expression "7.6.6Additive operators[expr.add]")
[*shift-expression*](expr.shift#nt:shift-expression "7.6.7Shift operators[expr.shift]") >> [*additive-expression*](expr.add#nt:additive-expression "7.6.6Additive operators[expr.add]")
[compare-expression:](expr.spaceship#nt:compare-expression "7.6.8Three-way comparison operator[expr.spaceship]")
[*shift-expression*](expr.shift#nt:shift-expression "7.6.7Shift operators[expr.shift]")
[*compare-expression*](expr.spaceship#nt:compare-expression "7.6.8Three-way comparison operator[expr.spaceship]") <=> [*shift-expression*](expr.shift#nt:shift-expression "7.6.7Shift operators[expr.shift]")
[relational-expression:](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]")
[*compare-expression*](expr.spaceship#nt:compare-expression "7.6.8Three-way comparison operator[expr.spaceship]")
[*relational-expression*](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]") < [*compare-expression*](expr.spaceship#nt:compare-expression "7.6.8Three-way comparison operator[expr.spaceship]")
[*relational-expression*](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]") > [*compare-expression*](expr.spaceship#nt:compare-expression "7.6.8Three-way comparison operator[expr.spaceship]")
[*relational-expression*](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]") <= [*compare-expression*](expr.spaceship#nt:compare-expression "7.6.8Three-way comparison operator[expr.spaceship]")
[*relational-expression*](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]") >= [*compare-expression*](expr.spaceship#nt:compare-expression "7.6.8Three-way comparison operator[expr.spaceship]")
[equality-expression:](expr.eq#nt:equality-expression "7.6.10Equality operators[expr.eq]")
[*relational-expression*](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]")
[*equality-expression*](expr.eq#nt:equality-expression "7.6.10Equality operators[expr.eq]") == [*relational-expression*](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]")
[*equality-expression*](expr.eq#nt:equality-expression "7.6.10Equality operators[expr.eq]") != [*relational-expression*](expr.rel#nt:relational-expression "7.6.9Relational operators[expr.rel]")
[and-expression:](expr.bit.and#nt:and-expression "7.6.11Bitwise AND operator[expr.bit.and]")
[*equality-expression*](expr.eq#nt:equality-expression "7.6.10Equality operators[expr.eq]")
[*and-expression*](expr.bit.and#nt:and-expression "7.6.11Bitwise AND operator[expr.bit.and]") & [*equality-expression*](expr.eq#nt:equality-expression "7.6.10Equality operators[expr.eq]")
[exclusive-or-expression:](expr.xor#nt:exclusive-or-expression "7.6.12Bitwise exclusive OR operator[expr.xor]")
[*and-expression*](expr.bit.and#nt:and-expression "7.6.11Bitwise AND operator[expr.bit.and]")
[*exclusive-or-expression*](expr.xor#nt:exclusive-or-expression "7.6.12Bitwise exclusive OR operator[expr.xor]") ^ [*and-expression*](expr.bit.and#nt:and-expression "7.6.11Bitwise AND operator[expr.bit.and]")
[inclusive-or-expression:](expr.or#nt:inclusive-or-expression "7.6.13Bitwise inclusive OR operator[expr.or]")
[*exclusive-or-expression*](expr.xor#nt:exclusive-or-expression "7.6.12Bitwise exclusive OR operator[expr.xor]")
[*inclusive-or-expression*](expr.or#nt:inclusive-or-expression "7.6.13Bitwise inclusive OR operator[expr.or]") | [*exclusive-or-expression*](expr.xor#nt:exclusive-or-expression "7.6.12Bitwise exclusive OR operator[expr.xor]")
[logical-and-expression:](expr.log.and#nt:logical-and-expression "7.6.14Logical AND operator[expr.log.and]")
[*inclusive-or-expression*](expr.or#nt:inclusive-or-expression "7.6.13Bitwise inclusive OR operator[expr.or]")
[*logical-and-expression*](expr.log.and#nt:logical-and-expression "7.6.14Logical AND operator[expr.log.and]") && [*inclusive-or-expression*](expr.or#nt:inclusive-or-expression "7.6.13Bitwise inclusive OR operator[expr.or]")
[logical-or-expression:](expr.log.or#nt:logical-or-expression "7.6.15Logical OR operator[expr.log.or]")
[*logical-and-expression*](expr.log.and#nt:logical-and-expression "7.6.14Logical AND operator[expr.log.and]")
[*logical-or-expression*](expr.log.or#nt:logical-or-expression "7.6.15Logical OR operator[expr.log.or]") || [*logical-and-expression*](expr.log.and#nt:logical-and-expression "7.6.14Logical AND operator[expr.log.and]")
[conditional-expression:](expr.cond#nt:conditional-expression "7.6.16Conditional operator[expr.cond]")
[*logical-or-expression*](expr.log.or#nt:logical-or-expression "7.6.15Logical OR operator[expr.log.or]")
[*logical-or-expression*](expr.log.or#nt:logical-or-expression "7.6.15Logical OR operator[expr.log.or]") ? [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") : [*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]")
[yield-expression:](expr.yield#nt:yield-expression "7.6.17Yielding a value[expr.yield]")
co_yield [*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]")
co_yield [*braced-init-list*](dcl.init.general#nt:braced-init-list "9.5.1General[dcl.init.general]")
[throw-expression:](expr.throw#nt:throw-expression "7.6.18Throwing an exception[expr.throw]")
throw [*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]")opt
[assignment-expression:](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]")
[*conditional-expression*](expr.cond#nt:conditional-expression "7.6.16Conditional operator[expr.cond]")
[*yield-expression*](expr.yield#nt:yield-expression "7.6.17Yielding a value[expr.yield]")
[*throw-expression*](expr.throw#nt:throw-expression "7.6.18Throwing an exception[expr.throw]")
[*logical-or-expression*](expr.log.or#nt:logical-or-expression "7.6.15Logical OR operator[expr.log.or]") [*assignment-operator*](expr.assign#nt:assignment-operator "7.6.19Assignment and compound assignment operators[expr.assign]") [*initializer-clause*](dcl.init.general#nt:initializer-clause "9.5.1General[dcl.init.general]")
[assignment-operator:](expr.assign#nt:assignment-operator "7.6.19Assignment and compound assignment operators[expr.assign]") one of
= *= /= %= += -= >>= <<= &= ^= |=
[expression:](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]")
[*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]")
[*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]") , [*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]")
[constant-expression:](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]")
[*conditional-expression*](expr.cond#nt:conditional-expression "7.6.16Conditional operator[expr.cond]")