The notation used for representing the C++ syntax in this document is described here.
cppkeyword | → | auto | break | bool | case | catch | char | const | const_cast | continue | default | delete | do | double | dynamic_cast | else | extern | false | float | for | goto | if | int | long | mutable | namespace | new | nullptr | operator | register | reinterpret_cast | return | short | signed | sizeof | static | static_cast | switch | this | throw | true | try | typedef | typeid | unsigned | using | void | volatile | wchar_t | while |
statement | → | labeled‑statement | empty‑statement | compound‑statement | selection‑statement | iteration‑statement | jump‑statement | declaration‑statement | try‑statement | expression‑statement |
labeled‑statement | → | identifier : statement | case : statement | default : statement |
empty‑statement | → | ; |
compound‑statement | → | { statement* } |
selection‑statement | → | if‑statement | switch‑statement |
if‑statement | → | if ( condition | ) statement (else statement)? |
switch‑statement | → | switch ( condition | ) statement |
iteration‑statement | → | while‑statement | do‑statement | range‑for‑statement | for‑statement |
while‑statement | → | while ( condition | ) statement |
do‑statement | → | do statement while ( expression ) ; |
range‑for‑statement | → | for ( for‑range‑declaration : expression ) statement |
for‑range‑declaration | → | type‑specifier‑seq declarator |
for‑statement | → | for ( for‑init‑statement condition ; expression? ) statement |
for‑init‑statement | → | empty‑statement | expression‑statement | simple‑declaration |
jump‑statement | → | break‑statement | continue‑statement | return‑statement | goto‑statement |
break‑statement | → | break ; |
continue‑statement | → | continue ; |
return‑statement | → | return expression? ; |
goto‑statement | → | goto identifier ; |
declaration‑statement | → | block‑declaration |
condition | → | type‑id declarator = assignment‑expression | expression |
try‑statement | → | try compound‑statement handler‑seq |
handler‑seq | → | handler handler‑seq? |
handler | → | catch ( exception‑declaration ) compound‑statement |
exception‑declaration | → | type‑specifier‑seq ( declarator | abstract‑declarator )? | ... |
expression‑statement | → | expression ; |
expression | → | assignment‑expression (, assignment‑expression)* |
constant‑expression | → | expression |
assignment‑expression | → | logical‑or‑expression assignment‑op assignment‑expression | conditional‑expression | throw‑expression |
assignment‑op | → | = | *= | /= | %= | += | -= | <<= | >>= | &= | ^= | |= |
conditional‑expression | → | logical‑or‑expression ? expression : assignment‑expression |
throw‑expression | → | throw assignment‑expression? |
logical‑or‑expression | → | logical‑and‑expression (|| logical‑and‑expression)* |
logical‑and‑expression | → | inclusive‑or‑expression (&& inclusive‑or‑expression)* |
inclusive‑or‑expression | → | exclusive‑or‑expression (| exclusive‑or‑expression)* |
exclusive‑or‑expression | → | and‑expression (^ and‑expression)* |
and‑expression | → | equality‑expression (& equality‑expression)* |
equality‑expression | → | relational‑expression ((== | !=) relational‑expression)* |
relational‑expression | → | shift‑expression ((< | > | <= | >=) shift‑expression)* |
shift‑expression | → | additive‑expression ((<< | >>) additive‑expression)* |
additive‑expression | → | multiplicative‑expression ((+ | -) multiplicative‑expression)* |
multiplicative‑expression | → | pm‑expression ((* | / | %) pm‑expression)* |
pm‑expression | → | cast‑expression ((.* | ->*) cast‑expression)* |
cast‑expression | → | ( type‑id ) cast‑expression | unary‑expression |
unary‑expression | → | postfix‑expression | postcast‑expression | ++ unary‑expression | -- unary‑expression | unary‑operator cast‑expression | sizeof ( type‑id ) | sizeof unary‑expression | new‑expression | delete‑expression |
unary‑operator | → | + | - | * | & | ! | ~ |
postfix‑expression | → |
primary‑expression ( [ expression ] | ( expression‑list ) | . id‑expression | -> id‑expression | ++ | -- )* | type‑specifier‑or‑type‑name ( expression‑list ) |
postcast‑expression | → | ( dynamic_cast | static_cast | reinterpret_cast | const_cast ) < type‑id > ( expression ) | type‑id ( expression ) |
expression‑list | → | assignment‑expression (, assignment‑expression)* |
primary‑expression | → | literal | this | ( expression ) | id‑expression |
id‑expression | → | qualified‑cpp‑id :: operator‑function‑id | ::? operator‑function‑id | qualified‑cpp‑id |
type‑specifier‑or‑type‑name | → | simple‑type‑specifier | type‑name |
new‑expression | → | ::? new new‑placement (new‑type‑id | ( type‑id )) new‑initializer? |
new‑placement | → | ( expression‑list ) |
new‑type‑id | → | (type‑specifier‑seq | type‑name) new‑declarator |
new‑declarator | → | (ptr‑operator new‑declarator? | direct‑new‑declarator |
new‑initializer | → | ( expression‑list? ) |
direct‑new‑declarator | → | [ expression ] ([ constant‑expression ] )* |
delete‑expression | → | ::? delete ([ ])? cast‑expression |
operator‑function‑id | → | operator operator |
operator | → | [ ] | ( ) | ->* | -> | , | -- | ++ | || | && | <= | >= | != | = | <<= | >>= | << | >> | |= | &= | ^= | %= | /= | *= | -= | += | < | > | = | ! | ~ | | | & | ^ | % | / | * | - | + | new [ ] | delete [ ] | new | delete |
qualified‑cpp‑id | → | ::? identifer (:: identifer)* |
literal | → | integer‑literal | floating‑literal | character‑literal | string‑literal | true | false | nullptr |
init‑declarator‑list | → | init‑declarator (, init‑declarator)* |
init‑declarator | → | declarator initiazer? |
declarator | → | direct‑declarator | ptr‑operator declarator |
direct‑declarator | → | declarator‑id ( [ constant‑expression? ] | ( declarator ) )* |
declarator‑id | → | id‑expression | type‑name |
type‑id | → | (type‑specifier‑seq | type‑name) abstract‑declarator? |
type | → | type‑specifier+ | type‑name |
type‑specifier‑seq | → | type‑specifier+ |
abstract‑declarator | → | ptr‑operator abstract‑declarator? | direct‑abstract‑declarator |
direct‑abstract‑declarator | → | [ constant‑expression? ] ( abstract‑declarator ) |
ptr‑operator | → | * cv‑qualifier‑seq? | & |
cv‑qualifier‑seq | → | cv‑qualifier+ |
initializer | → | = initializer‑clause | ( expression‑list ) |
initializer‑clause | → | assignment‑expression | { initializer‑list } | { } |
initializer‑list | → | initializer‑clause (, initializer‑clause)* |
block‑declaration | → | namespace‑alias‑definition | using‑directive | using‑declaration | simple‑declaration |
simple‑declaration | → | decl‑specifier‑seq? init‑declarator‑list? ; |
decl‑specifier‑seq | → | decl‑specifier+ | type‑name |
decl‑specifier | → | storage‑class‑specifier | type‑specifier | typedef |
storage‑class‑specifier | → | auto | register | static | extern | mutable |
type‑specifier | → | simple‑type‑specifier | cv‑qualifier |
simple‑type‑specifier | → | char | wchar_t | bool | short | int | long | signed | unsigned | float | double | void |
type‑name | → | qualified‑cpp‑id (< template‑argument‑list >)? |
template‑argument‑list | → | template‑argument (, template‑argument)* |
template‑argument | → | type‑id | assignment‑expression |
typedef | → | typedef |
cv‑qualifier | → | const | volatile |
namespace‑alias‑definition | → | namespace identifer = qualified‑cpp‑id ; |
using‑declaration | → | using qualified‑cpp‑id ; |
using‑directive | → | using namespace qualified‑cpp‑id ; |