cplusplus: preprocessing-file translation-unit
cplusplus
         ::= preprocessing-file? translation-unit
no referenceshex-quad: hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit
hex-quad ::= hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit
referenced by: universal-character-name universal-character-name: \u \U hex-quad hex-quad
         ::= ( '\u' | '\U' hex-quad ) hex-quad
referenced by: c-char identifier-nondigit s-char preprocessing-token: header-name identifier . digit digit identifier-nondigit e E sign . character-literal user-defined-character-literal string-literal user-defined-string-literal preprocessing-op-or-punc {each non-white-space character that cannot be one of the above}
         ::= header-name
           | identifier
           | '.'? digit ( digit | identifier-nondigit | ( 'e' | 'E' ) sign | '.' )*
           | character-literal
           | user-defined-character-literal
           | string-literal
           | user-defined-string-literal
           | preprocessing-op-or-punc
           | '{each non-white-space character that cannot be one of the above}'
referenced by: pp-tokens header-name: < {any member of the source character set except new-line and ">"} > " {any member of the source character set except new-line and "} "
         ::= '<' '{any member of the source character set except new-line and ">"}'+ '>'
           | '"' '{any member of the source character set except new-line and "}'+ '"'
referenced by: preprocessing-token identifier: identifier-nondigit identifier-nondigit digit
         ::= identifier-nondigit ( identifier-nondigit | digit )*
referenced by: alias-declaration attribute-namespace attribute-scoped-token attribute-token capture cast-expression class-name control-line elaborated-type-specifier enum-head enum-name enumerator identifier-list if-group jump-statement labeled-statement literal-operator-id mem-initializer-id member-declarator namespace-alias namespace-alias-definition nested-name-specifier opaque-enum-declaration original-namespace-definition original-namespace-name preprocessing-token qualified-id template-name type-parameter typedef-name typename-specifier ud-suffix unqualified-id identifier-nondigit: nondigit universal-character-name {other implementation-defined characters}
         ::= nondigit
           | universal-character-name
           | '{other implementation-defined characters}'
referenced by: identifier preprocessing-token nondigit: a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _
nondigit ::= 'a'
           | 'b'
           | 'c'
           | 'd'
           | 'e'
           | 'f'
           | 'g'
           | 'h'
           | 'i'
           | 'j'
           | 'k'
           | 'l'
           | 'm'
           | 'n'
           | 'o'
           | 'p'
           | 'q'
           | 'r'
           | 's'
           | 't'
           | 'u'
           | 'v'
           | 'w'
           | 'x'
           | 'y'
           | 'z'
           | 'A'
           | 'B'
           | 'C'
           | 'D'
           | 'E'
           | 'F'
           | 'G'
           | 'H'
           | 'I'
           | 'J'
           | 'K'
           | 'L'
           | 'M'
           | 'N'
           | 'O'
           | 'P'
           | 'Q'
           | 'R'
           | 'S'
           | 'T'
           | 'U'
           | 'V'
           | 'W'
           | 'X'
           | 'Y'
           | 'Z'
           | '_'
referenced by: identifier-nondigit digit: 0 1 2 3 4 5 6 7 8 9
digit    ::= '0'
           | '1'
           | '2'
           | '3'
           | '4'
           | '5'
           | '6'
           | '7'
           | '8'
           | '9'
referenced by: decimal-literal digit-sequence identifier preprocessing-token preprocessing-op-or-punc: { } [ ] # ## ( ) <: :> <% %> %: %:%: ; : ... new delete ? :: . .* + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
         ::= '{'
           | '}'
           | '['
           | ']'
           | '#'
           | '##'
           | '('
           | ')'
           | '<:'
           | ':>'
           | '<%'
           | '%>'
           | '%:'
           | '%:%:'
           | ';'
           | ':'
           | '...'
           | 'new'
           | 'delete'
           | '?'
           | '::'
           | '.'
           | '.*'
           | '+'
           | '-'
           | '*'
           | '/'
           | '%'
           | '^'
           | '&'
           | '|'
           | '~'
           | '!'
           | '='
           | '<'
           | '>'
           | '+='
           | '-='
           | '*='
           | '/='
           | '%='
           | '^='
           | '&='
           | '|='
           | '<<'
           | '>>'
           | '>>='
           | '<<='
           | '=='
           | '!='
           | '<='
           | '>='
           | '&&'
           | '||'
           | '++'
           | '--'
           | ','
           | '->*'
           | '->'
           | 'and'
           | 'and_eq'
           | 'bitand'
           | 'bitor'
           | 'compl'
           | 'not'
           | 'not_eq'
           | 'or'
           | 'or_eq'
           | 'xor'
           | 'xor_eq'
referenced by: preprocessing-token literal: integer-literal character-literal floating-literal string-literal boolean-literal nullptr user-defined-literal
           | character-literal
           | floating-literal
           | string-literal
           | boolean-literal
           | 'nullptr'
           | user-defined-literal
referenced by: primary-expression integer-literal: decimal-literal octal-literal hexadecimal-literal integer-suffix referenced by: literal decimal-literal: nonzero-digit digit
         ::= nonzero-digit digit*
referenced by: integer-literal user-defined-integer-literal octal-literal: 0 octal-digit
         ::= '0' octal-digit*
referenced by: integer-literal user-defined-integer-literal hexadecimal-literal: 0x 0X hexadecimal-digit
         ::= ( '0x' | '0X' ) hexadecimal-digit+
referenced by: integer-literal user-defined-integer-literal nonzero-digit: 1 2 3 4 5 6 7 8 9
         ::= '1'
           | '2'
           | '3'
           | '4'
           | '5'
           | '6'
           | '7'
           | '8'
           | '9'
referenced by: decimal-literal octal-digit: 0 1 2 3 4 5 6 7
         ::= '0'
           | '1'
           | '2'
           | '3'
           | '4'
           | '5'
           | '6'
           | '7'
referenced by: octal-escape-sequence octal-literal hexadecimal-digit: 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
         ::= '0'
           | '1'
           | '2'
           | '3'
           | '4'
           | '5'
           | '6'
           | '7'
           | '8'
           | '9'
           | 'a'
           | 'b'
           | 'c'
           | 'd'
           | 'e'
           | 'f'
           | 'A'
           | 'B'
           | 'C'
           | 'D'
           | 'E'
           | 'F'
referenced by: escape-sequence hex-quad hexadecimal-literal integer-suffix: unsigned-suffix long-suffix long-long-suffix long-suffix long-long-suffix unsigned-suffix
         ::= unsigned-suffix ( long-suffix | long-long-suffix )?
           | ( long-suffix | long-long-suffix ) unsigned-suffix?
referenced by: integer-literal unsigned-suffix: u U
         ::= 'u'
           | 'U'
referenced by: integer-suffix long-suffix: l L
         ::= 'l'
           | 'L'
referenced by: integer-suffix long-long-suffix: ll LL
         ::= 'll'
           | 'LL'
referenced by: integer-suffix character-literal: u U L ' c-char '
         ::= ( 'u' | 'U' | 'L' )? "'" c-char+ "'"
referenced by: literal preprocessing-token user-defined-character-literal c-char: {any member of the source character set except} {the single-quote, backslash "\", or new-line character} escape-sequence universal-character-name
c-char   ::= '{any member of the source character set except}'
           | '{the single-quote, backslash "\", or new-line character}'
           | escape-sequence
           | universal-character-name
referenced by: character-literal escape-sequence: simple-escape-sequence octal-escape-sequence \x hexadecimal-digit
         ::= simple-escape-sequence
           | octal-escape-sequence
           | '\x' hexadecimal-digit+
referenced by: c-char s-char simple-escape-sequence: \' \" \? \\ \a \b \f \n \r \t \v
         ::= "\'"
           | '\"'
           | '\?'
           | '\\'
           | '\a'
           | '\b'
           | '\f'
           | '\n'
           | '\r'
           | '\t'
           | '\v'
referenced by: escape-sequence octal-escape-sequence: \ octal-digit octal-digit octal-digit
         ::= '\' octal-digit ( octal-digit octal-digit? )?
referenced by: escape-sequence floating-literal: fractional-constant exponent-part digit-sequence exponent-part floating-suffix referenced by: literal fractional-constant: digit-sequence . digit-sequence digit-sequence .
         ::= digit-sequence? '.' digit-sequence
           | digit-sequence '.'
referenced by: floating-literal user-defined-floating-literal exponent-part: e E sign digit-sequence
         ::= ( 'e' | 'E' ) sign? digit-sequence
referenced by: floating-literal user-defined-floating-literal sign: + -
sign     ::= '+'
           | '-'
referenced by: exponent-part preprocessing-token digit-sequence: digit
         ::= digit+
referenced by: exponent-part floating-literal fractional-constant user-defined-floating-literal floating-suffix: f l F L
         ::= 'f'
           | 'l'
           | 'F'
           | 'L'
referenced by: floating-literal string-literal: encoding-prefix " s-char " R raw-string
         ::= encoding-prefix? ( '"' s-char* '"' | 'R' raw-string )
referenced by: asm-definition linkage-specification literal preprocessing-token static_assert-declaration user-defined-string-literal encoding-prefix: u8 u U L
         ::= 'u8'
           | 'u'
           | 'U'
           | 'L'
referenced by: string-literal s-char: {any member of the source character set except} {the double-quote, backslash "\", or new-line character} escape-sequence universal-character-name
s-char   ::= '{any member of the source character set except}'
           | '{the double-quote, backslash "\", or new-line character}'
           | escape-sequence
           | universal-character-name
referenced by: string-literal raw-string: " d-char-sequence ( r-char ) d-char-sequence "
         ::= '"' d-char-sequence? '(' r-char* ')' d-char-sequence? '"'
referenced by: string-literal r-char: {any member of the source character set, except} {a right parenthesis ")" followed by the initial \nonterminal{d-char-sequence}} {(which may be empty) followed by a double quote.}
r-char   ::= '{any member of the source character set, except}'
           | '{a right parenthesis ")" followed by the initial \nonterminal{d-char-sequence}}'
           | '{(which may be empty) followed by a double quote.}'
referenced by: raw-string d-char-sequence: d-char
         ::= d-char+
referenced by: raw-string d-char: {any member of the basic source character set except:} {space, the left parenthesis "(", the right parenthesis ")", the backslash "\",} {and the control characters representing horizontal tab,} {vertical tab, form feed, and newline.}
d-char   ::= '{any member of the basic source character set except:}'
           | '{space, the left parenthesis "(", the right parenthesis ")", the backslash "\",}'
           | '{and the control characters representing horizontal tab,}'
           | '{vertical tab, form feed, and newline.}'
referenced by: d-char-sequence boolean-literal: false true
         ::= 'false'
           | 'true'
referenced by: literal user-defined-literal: user-defined-integer-literal user-defined-floating-literal user-defined-string-literal user-defined-character-literal
         ::= user-defined-integer-literal
           | user-defined-floating-literal
           | user-defined-string-literal
           | user-defined-character-literal
referenced by: literal user-defined-integer-literal: decimal-literal octal-literal hexadecimal-literal ud-suffix referenced by: user-defined-literal user-defined-floating-literal: fractional-constant exponent-part digit-sequence exponent-part ud-suffix referenced by: user-defined-literal user-defined-string-literal: string-literal ud-suffix
         ::= string-literal ud-suffix
referenced by: preprocessing-token user-defined-literal user-defined-character-literal: character-literal ud-suffix
         ::= character-literal ud-suffix
referenced by: preprocessing-token user-defined-literal ud-suffix: identifier
         ::= identifier
referenced by: user-defined-character-literal user-defined-floating-literal user-defined-integer-literal user-defined-string-literal translation-unit: declaration-seq
         ::= declaration-seq?
referenced by: cplusplus primary-expression: literal this ( expression ) id-expression lambda-expression
         ::= literal
           | 'this'
           | '(' expression ')'
           | id-expression
           | lambda-expression
referenced by: cast-expression id-expression: unqualified-id qualified-id
         ::= unqualified-id
           | qualified-id
referenced by: cast-expression declarator-id primary-expression template-argument type-parameter unqualified-id: identifier operator-function-id conversion-function-id literal-operator-id ~ class-name decltype-specifier template-id
         ::= identifier
           | operator-function-id
           | conversion-function-id
           | literal-operator-id
           | '~' ( class-name | decltype-specifier )
           | template-id
referenced by: id-expression qualified-id using-declaration qualified-id: nested-name-specifier template unqualified-id :: identifier operator-function-id literal-operator-id template-id
         ::= nested-name-specifier 'template'? unqualified-id
           | '::' ( identifier | operator-function-id | literal-operator-id | template-id )
referenced by: id-expression nested-name-specifier: :: type-name namespace-name decltype-specifier :: identifier simple-template-id template
         ::= ( '::'? ( type-name | namespace-name ) | decltype-specifier ) '::' ( ( identifier | 'template'? simple-template-id ) '::' )*
referenced by: class-head-name class-or-decltype declarator-id elaborated-type-specifier enum-head pseudo-destructor-name ptr-operator qualified-id qualified-namespace-specifier simple-type-specifier typename-specifier using-declaration using-directive lambda-expression: lambda-introducer lambda-declarator compound-statement referenced by: primary-expression lambda-introducer: [ lambda-capture ]
         ::= '[' lambda-capture? ']'
referenced by: lambda-expression lambda-capture: capture-default , capture-list capture-list
         ::= capture-default ( ',' capture-list )?
           | capture-list
referenced by: lambda-introducer capture-default: & =
         ::= '&'
           | '='
referenced by: lambda-capture capture-list: capture ... ,
         ::= capture '...'? ( ',' capture '...'? )*
referenced by: lambda-capture capture: & identifier this
capture  ::= '&'? identifier
           | 'this'
referenced by: capture-list lambda-declarator: ( parameter-declaration-clause ) mutable exception-specification attribute-specifier-seq trailing-return-type referenced by: lambda-expression expression-list: initializer-list
         ::= initializer-list
referenced by: cast-expression initializer mem-initializer new-initializer new-placement pseudo-destructor-name: nested-name-specifier type-name ::~ ~ nested-name-specifier template simple-template-id ::~ type-name ~ decltype-specifier
         ::= ( nested-name-specifier? ( type-name '::~' | '~' ) | nested-name-specifier 'template' simple-template-id '::~' ) type-name
           | '~' decltype-specifier
referenced by: cast-expression unary-operator: * & + - ! ~
         ::= '*'
           | '&'
           | '+'
           | '-'
           | '!'
           | '~'
referenced by: cast-expression new-expression: :: new new-placement new-type-id ( type-id ) new-initializer
         ::= '::'? 'new' new-placement? ( new-type-id | '(' type-id ')' ) new-initializer?
referenced by: cast-expression new-placement: ( expression-list )
         ::= '(' expression-list ')'
referenced by: new-expression new-type-id: type-specifier-seq ptr-operator ptr-operator [ expression ] attribute-specifier-seq constant-expression [ referenced by: new-expression new-initializer: ( expression-list ) braced-init-list
         ::= '(' expression-list? ')'
           | braced-init-list
referenced by: new-expression delete-expression: :: delete delete[] cast-expression
         ::= '::'? ( 'delete' | 'delete[]' ) cast-expression
referenced by: cast-expression noexcept-expression: noexcept ( expression )
         ::= 'noexcept' '(' expression ')'
referenced by: cast-expression cast-expression: ( type-id ) sizeof primary-expression simple-type-specifier typename-specifier ( expression-list ) braced-init-list dynamic_cast static_cast reinterpret_cast const_cast < type-id > ( expression typeid ( expression type-id ) [ expression braced-init-list ] ( expression-list ) . -> template id-expression pseudo-destructor-name ++ -- ++ -- unary-operator cast-expression sizeof ( type-id ... ( identifier alignof ( type-id ) noexcept-expression new-expression delete-expression
         ::= ( '(' type-id ')' )* 'sizeof'* ( ( primary-expression | ( simple-type-specifier | typename-specifier ) ( '(' expression-list? ')' | braced-init-list ) | ( ( 'dynamic_cast' | 'static_cast' | 'reinterpret_cast' | 'const_cast' ) '<' type-id '>' '(' expression | 'typeid' '(' ( expression | type-id ) ) ')' ) ( '[' ( expression | braced-init-list ) ']' | '(' expression-list? ')' | ( '.' | '->' ) ( 'template'? id-expression | pseudo-destructor-name ) | '++' | '--' )* | ( '++' | '--' | unary-operator ) cast-expression | ( 'sizeof' ( '(' type-id | '...' '(' identifier ) | 'alignof' '(' type-id ) ')' | noexcept-expression | new-expression | delete-expression )
referenced by: cast-expression delete-expression pm-expression pm-expression: cast-expression .* ->*
         ::= cast-expression ( ( '.*' | '->*' ) cast-expression )*
referenced by: multiplicative-expression multiplicative-expression: pm-expression * / %
         ::= pm-expression ( ( '*' | '/' | '%' ) pm-expression )*
referenced by: additive-expression additive-expression: multiplicative-expression + -
         ::= multiplicative-expression ( ( '+' | '-' ) multiplicative-expression )*
referenced by: shift-expression shift-expression: additive-expression << >>
         ::= additive-expression ( ( '<<' | '>>' ) additive-expression )*
referenced by: relational-expression relational-expression: shift-expression < > <= >=
         ::= shift-expression ( ( '<' | '>' | '<=' | '>=' ) shift-expression )*
referenced by: equality-expression equality-expression: relational-expression == !=
         ::= relational-expression ( ( '==' | '!=' ) relational-expression )*
referenced by: and-expression and-expression: equality-expression &
         ::= equality-expression ( '&' equality-expression )*
referenced by: exclusive-or-expression exclusive-or-expression: and-expression ^
         ::= and-expression ( '^' and-expression )*
referenced by: inclusive-or-expression inclusive-or-expression: exclusive-or-expression |
         ::= exclusive-or-expression ( '|' exclusive-or-expression )*
referenced by: logical-and-expression logical-and-expression: inclusive-or-expression &&
         ::= inclusive-or-expression ( '&&' inclusive-or-expression )*
referenced by: logical-or-expression logical-or-expression: logical-and-expression ||
         ::= logical-and-expression ( '||' logical-and-expression )*
referenced by: assignment-expression conditional-expression conditional-expression: logical-or-expression ? expression : assignment-expression
         ::= logical-or-expression ( '?' expression ':' assignment-expression )?
referenced by: assignment-expression constant-expression assignment-expression: conditional-expression logical-or-expression assignment-operator initializer-clause throw-expression
         ::= conditional-expression
           | throw-expression
referenced by: conditional-expression expression initializer-clause throw-expression assignment-operator: = *= /= %= += -= >>= <<= &= ^= |=
         ::= '='
           | '*='
           | '/='
           | '%='
           | '+='
           | '-='
           | '>>='
           | '<<='
           | '&='
           | '^='
           | '|='
referenced by: assignment-expression expression: assignment-expression ,
         ::= assignment-expression ( ',' assignment-expression )*
referenced by: cast-expression condition conditional-expression decltype-specifier expression-statement for-range-initializer iteration-statement jump-statement new-type-id noexcept-expression primary-expression constant-expression: conditional-expression
         ::= conditional-expression
referenced by: abstract-declarator elif-group enumerator-definition if-group labeled-statement member-declarator new-type-id noexcept-specification noptr-abstract-declarator noptr-declarator static_assert-declaration template-argument statement: labeled-statement attribute-specifier-seq expression-statement compound-statement selection-statement iteration-statement jump-statement try-block declaration-statement
         ::= labeled-statement
           | declaration-statement
referenced by: compound-statement iteration-statement labeled-statement selection-statement labeled-statement: attribute-specifier-seq identifier case constant-expression default : statement
         ::= attribute-specifier-seq? ( identifier | 'case' constant-expression | 'default' ) ':' statement
referenced by: statement expression-statement: expression ;
         ::= expression? ';'
referenced by: for-init-statement statement compound-statement: { statement }
         ::= '{' statement* '}'
referenced by: function-body function-try-block handler lambda-expression statement try-block selection-statement: if ( condition ) statement else switch ( condition ) statement
         ::= ( 'if' '(' condition ')' ( statement 'else' )? | 'switch' '(' condition ')' ) statement
referenced by: statement condition: expression attribute-specifier-seq decl-specifier-seq declarator = initializer-clause braced-init-list
         ::= expression
referenced by: iteration-statement selection-statement iteration-statement: while ( condition for ( for-init-statement condition ; expression for-range-declaration : for-range-initializer ) statement do statement while ( expression ) ;
         ::= ( 'while' '(' condition | 'for' '(' ( for-init-statement condition? ';' expression? | for-range-declaration ':' for-range-initializer ) ) ')' statement
           | 'do' statement 'while' '(' expression ')' ';'
referenced by: statement for-init-statement: expression-statement simple-declaration
         ::= expression-statement
           | simple-declaration
referenced by: iteration-statement for-range-declaration: attribute-specifier-seq decl-specifier-seq declarator referenced by: iteration-statement for-range-initializer: expression braced-init-list
         ::= expression
           | braced-init-list
referenced by: iteration-statement jump-statement: break continue goto identifier return expression braced-init-list ;
         ::= ( 'break' | 'continue' | 'goto' identifier | 'return' ( expression | braced-init-list )? ) ';'
referenced by: statement declaration-statement: block-declaration
         ::= block-declaration
referenced by: statement declaration-seq: declaration
         ::= declaration+
referenced by: linkage-specification namespace-body translation-unit declaration: block-declaration function-definition template-declaration explicit-instantiation explicit-specialization linkage-specification namespace-definition ; attribute-declaration
         ::= block-declaration
           | function-definition
           | template-declaration
           | explicit-instantiation
           | explicit-specialization
           | linkage-specification
           | namespace-definition
           | ';'
           | attribute-declaration
referenced by: declaration-seq explicit-instantiation explicit-specialization linkage-specification template-declaration block-declaration: simple-declaration asm-definition namespace-alias-definition using-declaration using-directive static_assert-declaration alias-declaration opaque-enum-declaration
         ::= simple-declaration
           | asm-definition
           | namespace-alias-definition
           | using-declaration
           | using-directive
           | static_assert-declaration
           | alias-declaration
           | opaque-enum-declaration
referenced by: declaration declaration-statement alias-declaration: using identifier attribute-specifier-seq = type-id ;
         ::= 'using' identifier attribute-specifier-seq? '=' type-id ';'
referenced by: block-declaration member-declaration simple-declaration: decl-specifier-seq init-declarator-list attribute-specifier-seq decl-specifier-seq init-declarator-list ; referenced by: block-declaration for-init-statement static_assert-declaration: static_assert ( constant-expression , string-literal ) ;
         ::= 'static_assert' '(' constant-expression ',' string-literal ')' ';'
referenced by: block-declaration member-declaration attribute-declaration: attribute-specifier-seq ;
         ::= attribute-specifier-seq ';'
referenced by: declaration decl-specifier: storage-class-specifier type-specifier function-specifier friend typedef constexpr
         ::= storage-class-specifier
           | type-specifier
           | function-specifier
           | 'friend'
           | 'typedef'
           | 'constexpr'
referenced by: decl-specifier-seq decl-specifier-seq: decl-specifier attribute-specifier-seq
         ::= decl-specifier+ attribute-specifier-seq?
referenced by: condition for-range-declaration function-definition member-declaration parameter-declaration simple-declaration storage-class-specifier: register static thread_local extern mutable
         ::= 'register'
           | 'static'
           | 'thread_local'
           | 'extern'
           | 'mutable'
referenced by: decl-specifier function-specifier: inline virtual explicit
         ::= 'inline'
           | 'virtual'
           | 'explicit'
referenced by: decl-specifier typedef-name: identifier
         ::= identifier
referenced by: type-name type-specifier: trailing-type-specifier class-specifier enum-specifier
         ::= trailing-type-specifier
           | class-specifier
           | enum-specifier
referenced by: decl-specifier type-specifier-seq trailing-type-specifier: simple-type-specifier elaborated-type-specifier typename-specifier cv-qualifier
         ::= simple-type-specifier
           | elaborated-type-specifier
           | typename-specifier
           | cv-qualifier
referenced by: trailing-return-type type-specifier type-specifier-seq: type-specifier attribute-specifier-seq
         ::= type-specifier+ attribute-specifier-seq?
referenced by: conversion-type-id enum-base exception-declaration new-type-id type-id simple-type-specifier: nested-name-specifier type-name nested-name-specifier template simple-template-id char char16_t char32_t wchar_t bool short int long signed unsigned float double void auto decltype-specifier
         ::= nested-name-specifier? type-name
           | nested-name-specifier 'template' simple-template-id
           | 'char'
           | 'char16_t'
           | 'char32_t'
           | 'wchar_t'
           | 'bool'
           | 'short'
           | 'int'
           | 'long'
           | 'signed'
           | 'unsigned'
           | 'float'
           | 'double'
           | 'void'
           | 'auto'
           | decltype-specifier
referenced by: cast-expression trailing-type-specifier type-name: class-name enum-name typedef-name simple-template-id
         ::= class-name
           | enum-name
           | typedef-name
           | simple-template-id
referenced by: nested-name-specifier pseudo-destructor-name simple-type-specifier decltype-specifier: decltype ( expression )
         ::= 'decltype' '(' expression ')'
referenced by: class-or-decltype nested-name-specifier pseudo-destructor-name simple-type-specifier unqualified-id elaborated-type-specifier: class-key attribute-specifier-seq nested-name-specifier identifier nested-name-specifier template simple-template-id enum nested-name-specifier identifier
           | 'enum' nested-name-specifier? identifier
referenced by: trailing-type-specifier enum-name: identifier
         ::= identifier
referenced by: type-name enum-specifier: enum-head { enumerator-definition , , }
         ::= enum-head '{' ( enumerator-definition ( ',' enumerator-definition )* ','? )? '}'
referenced by: type-specifier enum-head: enum-key attribute-specifier-seq nested-name-specifier identifier enum-base referenced by: enum-specifier opaque-enum-declaration: enum-key attribute-specifier-seq identifier enum-base ; referenced by: block-declaration enum-key: enum class struct
enum-key ::= 'enum' ( 'class' | 'struct' )?
referenced by: enum-head opaque-enum-declaration enum-base: : type-specifier-seq
         ::= ':' type-specifier-seq
referenced by: enum-head opaque-enum-declaration enumerator-definition: enumerator = constant-expression
         ::= enumerator ( '=' constant-expression )?
referenced by: enum-specifier enumerator: identifier
         ::= identifier
referenced by: enumerator-definition namespace-name: original-namespace-name namespace-alias
         ::= original-namespace-name
           | namespace-alias
referenced by: nested-name-specifier qualified-namespace-specifier using-directive original-namespace-name: identifier
         ::= identifier
referenced by: extension-namespace-definition namespace-name namespace-definition: named-namespace-definition unnamed-namespace-definition
         ::= named-namespace-definition
           | unnamed-namespace-definition
referenced by: declaration named-namespace-definition: original-namespace-definition extension-namespace-definition
         ::= original-namespace-definition
           | extension-namespace-definition
referenced by: namespace-definition original-namespace-definition: inline namespace identifier { namespace-body }
         ::= 'inline'? 'namespace' identifier '{' namespace-body '}'
referenced by: named-namespace-definition extension-namespace-definition: inline namespace original-namespace-name { namespace-body }
         ::= 'inline'? 'namespace' original-namespace-name '{' namespace-body '}'
referenced by: named-namespace-definition unnamed-namespace-definition: inline namespace { namespace-body }
         ::= 'inline'? 'namespace' '{' namespace-body '}'
referenced by: namespace-definition namespace-body: declaration-seq
         ::= declaration-seq?
referenced by: extension-namespace-definition original-namespace-definition unnamed-namespace-definition namespace-alias: identifier
         ::= identifier
referenced by: namespace-name namespace-alias-definition: namespace identifier = qualified-namespace-specifier ;
         ::= 'namespace' identifier '=' qualified-namespace-specifier ';'
referenced by: block-declaration qualified-namespace-specifier: nested-name-specifier namespace-name
         ::= nested-name-specifier? namespace-name
referenced by: namespace-alias-definition using-declaration: using typename nested-name-specifier :: unqualified-id ;
         ::= 'using' ( 'typename'? nested-name-specifier | '::' ) unqualified-id ';'
referenced by: block-declaration member-declaration using-directive: attribute-specifier-seq using namespace nested-name-specifier namespace-name ;
         ::= attribute-specifier-seq? 'using' 'namespace' nested-name-specifier? namespace-name ';'
referenced by: block-declaration asm-definition: asm ( string-literal );
         ::= 'asm' '(' string-literal ');'
referenced by: block-declaration linkage-specification: extern string-literal { declaration-seq } declaration
         ::= 'extern' string-literal ( '{' declaration-seq? '}' | declaration )
referenced by: declaration attribute-specifier-seq: attribute-specifier
         ::= attribute-specifier+
referenced by: abstract-declarator alias-declaration attribute-declaration base-specifier class-head condition decl-specifier-seq elaborated-type-specifier enum-head exception-declaration for-range-declaration function-definition labeled-statement lambda-declarator member-declaration member-declarator new-type-id noptr-abstract-declarator noptr-declarator opaque-enum-declaration parameter-declaration parameters-and-qualifiers ptr-operator simple-declaration statement trailing-return-type type-specifier-seq using-directive attribute-specifier: [ [ attribute ... , ] ] alignment-specifier
         ::= '[' '[' ( attribute '...'? )? ( ',' ( attribute '...'? )? )* ']' ']'
           | alignment-specifier
referenced by: attribute-specifier-seq alignment-specifier: alignas ( type-id alignment-expression ... )
         ::= 'alignas' '(' ( type-id | alignment-expression ) '...'? ')'
referenced by: attribute-specifier attribute: attribute-token attribute-argument-clause referenced by: attribute-specifier attribute-token: identifier attribute-scoped-token
         ::= identifier
           | attribute-scoped-token
referenced by: attribute attribute-scoped-token: attribute-namespace :: identifier
         ::= attribute-namespace '::' identifier
referenced by: attribute-token attribute-namespace: identifier
         ::= identifier
referenced by: attribute-scoped-token attribute-argument-clause: ( balanced-token-seq )
         ::= '(' balanced-token-seq ')'
referenced by: attribute balanced-token-seq: balanced-token balanced-token
         ::= balanced-token? balanced-token*
referenced by: attribute-argument-clause balanced-token balanced-token: ( balanced-token-seq ) [ balanced-token-seq ] { balanced-token-seq } {any token other than a parenthesis, a bracket, or a brace}
         ::= '(' balanced-token-seq ')'
           | '[' balanced-token-seq ']'
           | '{' balanced-token-seq '}'
           | '{any token other than a parenthesis, a bracket, or a brace}'
referenced by: balanced-token-seq init-declarator-list: init-declarator ,
         ::= init-declarator ( ',' init-declarator )*
referenced by: simple-declaration init-declarator: declarator initializer
         ::= declarator initializer?
referenced by: init-declarator-list declarator: ptr-declarator noptr-declarator parameters-and-qualifiers trailing-return-type
         ::= ptr-declarator
referenced by: condition exception-declaration for-range-declaration function-definition init-declarator member-declarator parameter-declaration ptr-declarator: ptr-operator noptr-declarator
         ::= ptr-operator* noptr-declarator
referenced by: declarator noptr-declarator noptr-declarator: declarator-id attribute-specifier-seq ( ptr-declarator ) parameters-and-qualifiers [ constant-expression ] attribute-specifier-seq referenced by: declarator ptr-declarator parameters-and-qualifiers: ( parameter-declaration-clause ) attribute-specifier-seq cv-qualifier-seq ref-qualifier exception-specification referenced by: abstract-declarator declarator noptr-abstract-declarator noptr-declarator trailing-return-type: -> trailing-type-specifier attribute-specifier-seq abstract-declarator referenced by: abstract-declarator declarator lambda-declarator ptr-operator: nested-name-specifier * attribute-specifier-seq cv-qualifier-seq & && attribute-specifier-seq
           | ( '&' | '&&' ) attribute-specifier-seq?
referenced by: abstract-declarator conversion-type-id new-type-id ptr-abstract-declarator ptr-declarator cv-qualifier-seq: cv-qualifier
         ::= cv-qualifier+
referenced by: parameters-and-qualifiers ptr-operator cv-qualifier: const volatile
         ::= 'const'
           | 'volatile'
referenced by: cv-qualifier-seq trailing-type-specifier ref-qualifier: & &&
         ::= '&'
           | '&&'
referenced by: parameters-and-qualifiers declarator-id: ... id-expression nested-name-specifier class-name
         ::= '...'? id-expression
           | nested-name-specifier? class-name
referenced by: noptr-declarator type-id: type-specifier-seq abstract-declarator referenced by: alias-declaration alignment-specifier cast-expression dynamic-exception-specification new-expression template-argument type-parameter abstract-declarator: ptr-operator ... parameters-and-qualifiers [ constant-expression ] attribute-specifier-seq ptr-abstract-declarator noptr-abstract-declarator parameters-and-qualifiers trailing-return-type
         ::= ptr-abstract-declarator
referenced by: exception-declaration parameter-declaration trailing-return-type type-id ptr-abstract-declarator: ptr-operator noptr-abstract-declarator ptr-operator referenced by: abstract-declarator noptr-abstract-declarator noptr-abstract-declarator: parameters-and-qualifiers [ constant-expression ] attribute-specifier-seq ( ptr-abstract-declarator ) parameters-and-qualifiers [ constant-expression ] attribute-specifier-seq referenced by: abstract-declarator ptr-abstract-declarator parameter-declaration-clause: parameter-declaration-list ... parameter-declaration-list , ...
         ::= parameter-declaration-list? '...'?
           | parameter-declaration-list ',' '...'
referenced by: lambda-declarator parameters-and-qualifiers parameter-declaration-list: parameter-declaration ,
         ::= parameter-declaration ( ',' parameter-declaration )*
referenced by: parameter-declaration-clause parameter-declaration: attribute-specifier-seq decl-specifier-seq abstract-declarator declarator = initializer-clause referenced by: parameter-declaration-list template-parameter function-definition: attribute-specifier-seq decl-specifier-seq declarator virt-specifier-seq function-body referenced by: declaration member-declaration function-body: ctor-initializer compound-statement function-try-block = default delete ;
         ::= ctor-initializer? compound-statement
           | function-try-block
           | '=' ( 'default' | 'delete' ) ';'
referenced by: function-definition initializer: brace-or-equal-initializer ( expression-list )
         ::= brace-or-equal-initializer
           | '(' expression-list ')'
referenced by: init-declarator brace-or-equal-initializer: = initializer-clause braced-init-list
         ::= '=' initializer-clause
           | braced-init-list
referenced by: initializer member-declarator initializer-clause: assignment-expression braced-init-list
         ::= assignment-expression
           | braced-init-list
referenced by: assignment-expression brace-or-equal-initializer condition initializer-list parameter-declaration initializer-list: initializer-clause ... ,
         ::= initializer-clause '...'? ( ',' initializer-clause '...'? )*
referenced by: braced-init-list expression-list braced-init-list: { initializer-list , }
         ::= '{' ( initializer-list ','? )? '}'
referenced by: brace-or-equal-initializer cast-expression condition for-range-initializer initializer-clause jump-statement mem-initializer new-initializer class-name: identifier simple-template-id
         ::= identifier
           | simple-template-id
referenced by: class-head-name class-or-decltype declarator-id type-name unqualified-id class-specifier: class-head { member-declaration access-specifier : }
         ::= class-head '{' ( member-declaration | access-specifier ':' )* '}'
referenced by: type-specifier class-head: class-key attribute-specifier-seq class-head-name final base-clause
         ::= class-key attribute-specifier-seq? ( class-head-name 'final'? )? base-clause?
referenced by: class-specifier class-head-name: nested-name-specifier class-name
         ::= nested-name-specifier? class-name
referenced by: class-head class-key: class struct union
         ::= 'class'
           | 'struct'
           | 'union'
referenced by: class-head elaborated-type-specifier member-declaration: attribute-specifier-seq decl-specifier-seq member-declarator , ; function-definition ; using-declaration static_assert-declaration template-declaration alias-declaration
           | function-definition ';'?
           | using-declaration
           | static_assert-declaration
           | template-declaration
           | alias-declaration
referenced by: class-specifier member-declarator: declarator virt-specifier-seq pure-specifier brace-or-equal-initializer identifier attribute-specifier-seq : constant-expression referenced by: member-declaration virt-specifier-seq: virt-specifier
         ::= virt-specifier+
referenced by: function-definition member-declarator virt-specifier: override final
         ::= 'override'
           | 'final'
referenced by: virt-specifier-seq pure-specifier: = 0
         ::= '=' '0'
referenced by: member-declarator base-clause: : base-specifier ... ,
         ::= ':' base-specifier '...'? ( ',' base-specifier '...'? )*
referenced by: class-head base-specifier: attribute-specifier-seq virtual access-specifier access-specifier virtual base-type-specifier
         ::= attribute-specifier-seq? ( 'virtual' access-specifier? | access-specifier 'virtual'? )? base-type-specifier
referenced by: base-clause class-or-decltype: nested-name-specifier class-name decltype-specifier
         ::= nested-name-specifier? class-name
           | decltype-specifier
referenced by: base-type-specifier mem-initializer-id base-type-specifier: class-or-decltype
         ::= class-or-decltype
referenced by: base-specifier access-specifier: private protected public
         ::= 'private'
           | 'protected'
           | 'public'
referenced by: base-specifier class-specifier conversion-function-id: operator conversion-type-id
         ::= 'operator' conversion-type-id
referenced by: unqualified-id conversion-type-id: type-specifier-seq ptr-operator
         ::= type-specifier-seq ptr-operator*
referenced by: conversion-function-id ctor-initializer: : mem-initializer-list
         ::= ':' mem-initializer-list
referenced by: function-body function-try-block mem-initializer-list: mem-initializer , mem-initializer-list ...
         ::= mem-initializer ( ',' mem-initializer-list )? '...'?
referenced by: ctor-initializer mem-initializer-list mem-initializer: mem-initializer-id ( expression-list ) braced-init-list
         ::= mem-initializer-id ( '(' expression-list? ')' | braced-init-list )
referenced by: mem-initializer-list mem-initializer-id: class-or-decltype identifier
         ::= class-or-decltype
           | identifier
referenced by: mem-initializer operator-function-id: operator operator
         ::= 'operator' operator
referenced by: qualified-id template-id unqualified-id operator: new delete new[] delete[] + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () []
operator ::= 'new'
           | 'delete'
           | 'new[]'
           | 'delete[]'
           | '+'
           | '-'
           | '*'
           | '/'
           | '%'
           | '^'
           | '&'
           | '|'
           | '~'
           | '!'
           | '='
           | '<'
           | '>'
           | '+='
           | '-='
           | '*='
           | '/='
           | '%='
           | '^='
           | '&='
           | '|='
           | '<<'
           | '>>'
           | '>>='
           | '<<='
           | '=='
           | '!='
           | '<='
           | '>='
           | '&&'
           | '||'
           | '++'
           | '--'
           | ','
           | '->*'
           | '->'
           | '()'
           | '[]'
referenced by: operator-function-id literal-operator-id: operator "" identifier
         ::= 'operator' '""' identifier
referenced by: qualified-id template-id unqualified-id template-declaration: template < template-parameter-list > declaration
         ::= 'template' '<' template-parameter-list '>' declaration
referenced by: declaration member-declaration template-parameter-list: template-parameter ,
         ::= template-parameter ( ',' template-parameter )*
referenced by: template-declaration type-parameter template-parameter: type-parameter parameter-declaration
         ::= type-parameter
           | parameter-declaration
referenced by: template-parameter-list type-parameter: class typename ... identifier identifier = type-id template < template-parameter-list > class ... identifier identifier = id-expression
         ::= ( 'class' | 'typename' ) ( '...'? identifier? | identifier? '=' type-id )
           | 'template' '<' template-parameter-list '>' 'class' ( '...'? identifier? | identifier? '=' id-expression )
referenced by: template-parameter simple-template-id: template-name < template-argument-list >
         ::= template-name '<' template-argument-list? '>'
referenced by: class-name elaborated-type-specifier nested-name-specifier pseudo-destructor-name simple-type-specifier template-id type-name typename-specifier template-id: simple-template-id operator-function-id literal-operator-id < template-argument-list >
         ::= simple-template-id
           | ( operator-function-id | literal-operator-id ) '<' template-argument-list? '>'
referenced by: qualified-id unqualified-id template-name: identifier
         ::= identifier
referenced by: simple-template-id template-argument-list: template-argument ... ,
         ::= template-argument '...'? ( ',' template-argument '...'? )*
referenced by: simple-template-id template-id template-argument: constant-expression type-id id-expression
         ::= constant-expression
           | type-id
           | id-expression
referenced by: template-argument-list typename-specifier: typename nested-name-specifier identifier template simple-template-id
         ::= 'typename' nested-name-specifier ( identifier | 'template'? simple-template-id )
referenced by: cast-expression trailing-type-specifier explicit-instantiation: extern template declaration
         ::= 'extern'? 'template' declaration
referenced by: declaration explicit-specialization: template < > declaration
         ::= 'template' '<' '>' declaration
referenced by: declaration try-block: try compound-statement handler-seq
         ::= 'try' compound-statement handler-seq
referenced by: statement function-try-block: try ctor-initializer compound-statement handler-seq
         ::= 'try' ctor-initializer? compound-statement handler-seq
referenced by: function-body handler-seq: handler
         ::= handler+
referenced by: function-try-block try-block handler: catch ( exception-declaration ) compound-statement referenced by: handler-seq exception-declaration: attribute-specifier-seq type-specifier-seq declarator abstract-declarator ...
           | '...'
referenced by: handler throw-expression: throw assignment-expression
         ::= 'throw' assignment-expression?
referenced by: assignment-expression exception-specification: dynamic-exception-specification noexcept-specification
         ::= dynamic-exception-specification
           | noexcept-specification
referenced by: lambda-declarator parameters-and-qualifiers dynamic-exception-specification: throw ( type-id ... , )
         ::= 'throw' '(' ( type-id '...'? ( ',' type-id '...'? )* )? ')'
referenced by: exception-specification noexcept-specification: noexcept ( constant-expression )
         ::= 'noexcept' ( '(' constant-expression ')' )?
referenced by: exception-specification preprocessing-file: group
         ::= group?
referenced by: cplusplus group: group-part
group    ::= group-part+
referenced by: elif-group else-group if-group preprocessing-file group-part: if-section control-line text-line # non-directive
         ::= if-section
           | control-line
           | text-line
           | '#' non-directive
referenced by: group if-section: if-group elif-group else-group endif-line
         ::= if-group elif-group* else-group? endif-line
referenced by: group-part if-group: #if constant-expression #ifdef #ifndef identifier {the new-line character} group
if-group ::= ( '#if' constant-expression | ( '#ifdef' | '#ifndef' ) identifier ) '{the new-line character}' group?
referenced by: if-section elif-group: #elif constant-expression {the new-line character} group
         ::= '#elif' constant-expression '{the new-line character}' group?
referenced by: if-section else-group: #else {the new-line character} group
         ::= '#else' '{the new-line character}' group?
referenced by: if-section endif-line: #endif {the new-line character}
         ::= '#endif' '{the new-line character}'
referenced by: if-section control-line: #include #line pp-tokens #undef identifier #error #pragma pp-tokens # #define identifier {a "(" character not immediately preceded by white-space} identifier-list identifier-list , ... ) replacement-list {the new-line character}
         ::= ( ( '#include' | '#line' ) pp-tokens | '#undef' identifier | ( '#error' | '#pragma' ) pp-tokens? | '#' | '#define' identifier ( '{a "(" character not immediately preceded by white-space}' ( identifier-list | ( identifier-list ',' )? '...' )? ')' )? replacement-list ) '{the new-line character}'
referenced by: group-part text-line: pp-tokens {the new-line character}
         ::= pp-tokens? '{the new-line character}'
referenced by: group-part non-directive: pp-tokens {the new-line character}
         ::= pp-tokens '{the new-line character}'
referenced by: group-part identifier-list: identifier ,
         ::= identifier ( ',' identifier )*
referenced by: control-line replacement-list: pp-tokens
         ::= pp-tokens?
referenced by: control-line pp-tokens: preprocessing-token
         ::= preprocessing-token+
referenced by: control-line non-directive replacement-list text-line   ... generated by RR - Railroad Diagram Generator R R