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