50 KiB
[gram.dcl]
Annex A (informative) Grammar summary [gram]
A.7 Declarations [gram.dcl]
declaration-seq:
declaration declaration-seqopt
declaration:
name-declaration
special-declaration
name-declaration:
block-declaration
nodeclspec-function-declaration
function-definition
friend-type-declaration
template-declaration
deduction-guide
linkage-specification
namespace-definition
empty-declaration
attribute-declaration
module-import-declaration
special-declaration:
explicit-instantiation
explicit-specialization
export-declaration
block-declaration:
simple-declaration
asm-declaration
namespace-alias-definition
using-declaration
using-enum-declaration
using-directive
static_assert-declaration
consteval-block-declaration
alias-declaration
opaque-enum-declaration
nodeclspec-function-declaration:
attribute-specifier-seqopt declarator ;
alias-declaration:
using identifier attribute-specifier-seqopt = defining-type-id ;
sb-identifier:
...opt identifier attribute-specifier-seqopt
sb-identifier-list:
sb-identifier
sb-identifier-list , sb-identifier
structured-binding-declaration:
attribute-specifier-seqopt decl-specifier-seq ref-qualifieropt [ sb-identifier-list ]
simple-declaration:
decl-specifier-seq init-declarator-listopt ;
attribute-specifier-seq decl-specifier-seq init-declarator-list ;
structured-binding-declaration initializer ;
static_assert-message:
unevaluated-string
constant-expression
static_assert-declaration:
static_assert ( constant-expression ) ;
static_assert ( constant-expression , static_assert-message ) ;
consteval-block-declaration:
consteval compound-statement
attribute-declaration:
attribute-specifier-seq ;
decl-specifier:
storage-class-specifier
defining-type-specifier
function-specifier
friend
typedef
constexpr
consteval
constinit
inline
decl-specifier-seq:
decl-specifier attribute-specifier-seqopt
decl-specifier decl-specifier-seq
storage-class-specifier:
static
thread_local
extern
mutable
function-specifier:
virtual
explicit-specifier
explicit-specifier:
explicit ( constant-expression )
explicit
typedef-name:
identifier
simple-template-id
type-specifier:
simple-type-specifier
elaborated-type-specifier
typename-specifier
cv-qualifier
type-specifier-seq:
type-specifier attribute-specifier-seqopt
type-specifier type-specifier-seq
defining-type-specifier:
type-specifier
class-specifier
enum-specifier
defining-type-specifier-seq:
defining-type-specifier attribute-specifier-seqopt
defining-type-specifier defining-type-specifier-seq
simple-type-specifier:
nested-name-specifieropt type-name
nested-name-specifier template simple-template-id
computed-type-specifier
placeholder-type-specifier
nested-name-specifieropt template-name
char
char8_t
char16_t
char32_t
wchar_t
bool
short
int
long
signed
unsigned
float
double
void
type-name:
class-name
enum-name
typedef-name
computed-type-specifier:
decltype-specifier
pack-index-specifier
splice-type-specifier
pack-index-specifier:
typedef-name ... [ constant-expression ]
elaborated-type-specifier:
class-key attribute-specifier-seqopt nested-name-specifieropt identifier
class-key simple-template-id
class-key nested-name-specifier templateopt simple-template-id
enum nested-name-specifieropt identifier
decltype-specifier:
decltype ( expression )
placeholder-type-specifier:
type-constraintopt auto
type-constraintopt decltype ( auto )
splice-type-specifier:
typenameopt splice-specifier
typenameopt splice-specialization-specifier
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator initializer
declarator requires-clauseopt function-contract-specifier-seqopt
declarator:
ptr-declarator
noptr-declarator parameters-and-qualifiers trailing-return-type
ptr-declarator:
noptr-declarator
ptr-operator ptr-declarator
noptr-declarator:
declarator-id attribute-specifier-seqopt
noptr-declarator parameters-and-qualifiers
noptr-declarator [ constant-expressionopt ] attribute-specifier-seqopt
( ptr-declarator )
parameters-and-qualifiers:
( parameter-declaration-clause ) cv-qualifier-seqopt
ref-qualifieropt noexcept-specifieropt attribute-specifier-seqopt
trailing-return-type:
-> type-id
- attribute-specifier-seqopt cv-qualifier-seqopt
& attribute-specifier-seqopt
&& attribute-specifier-seqopt
nested-name-specifier * attribute-specifier-seqopt cv-qualifier-seqopt
cv-qualifier-seq:
cv-qualifier cv-qualifier-seqopt
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...opt id-expression
type-id:
type-specifier-seq abstract-declaratoropt
defining-type-id:
defining-type-specifier-seq abstract-declaratoropt
abstract-declarator:
ptr-abstract-declarator
noptr-abstract-declaratoropt parameters-and-qualifiers trailing-return-type
abstract-pack-declarator
ptr-abstract-declarator:
noptr-abstract-declarator
ptr-operator ptr-abstract-declaratoropt
noptr-abstract-declarator:
noptr-abstract-declaratoropt parameters-and-qualifiers
noptr-abstract-declaratoropt [ constant-expressionopt ] attribute-specifier-seqopt
( ptr-abstract-declarator )
abstract-pack-declarator:
noptr-abstract-pack-declarator
ptr-operator abstract-pack-declarator
noptr-abstract-pack-declarator:
noptr-abstract-pack-declarator parameters-and-qualifiers
...
parameter-declaration-clause:
...
parameter-declaration-listopt
parameter-declaration-list , ...
parameter-declaration-list ...
parameter-declaration-list:
parameter-declaration
parameter-declaration-list , parameter-declaration
parameter-declaration:
attribute-specifier-seqopt thisopt decl-specifier-seq declarator
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
attribute-specifier-seqopt thisopt decl-specifier-seq abstract-declaratoropt
attribute-specifier-seqopt decl-specifier-seq abstract-declaratoropt = initializer-clause
function-contract-specifier-seq:
function-contract-specifier function-contract-specifier-seqopt
function-contract-specifier:
precondition-specifier
postcondition-specifier
precondition-specifier:
pre attribute-specifier-seqopt ( conditional-expression )
postcondition-specifier:
post attribute-specifier-seqopt ( result-name-introduceropt conditional-expression )
attributed-identifier:
identifier attribute-specifier-seqopt
result-name-introducer:
attributed-identifier :
initializer:
brace-or-equal-initializer
( expression-list )
brace-or-equal-initializer:
= initializer-clause
braced-init-list
initializer-clause:
assignment-expression
braced-init-list
braced-init-list:
{ initializer-list ,opt }
{ designated-initializer-list ,opt }
{ }
initializer-list:
initializer-clause ...opt
initializer-list , initializer-clause ...opt
designated-initializer-list:
designated-initializer-clause
designated-initializer-list , designated-initializer-clause
designated-initializer-clause:
designator brace-or-equal-initializer
expr-or-braced-init-list:
expression
braced-init-list
function-definition:
attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt
function-contract-specifier-seqopt function-body
attribute-specifier-seqopt decl-specifier-seqopt declarator requires-clause
function-contract-specifier-seqopt function-body
function-body:
ctor-initializeropt compound-statement
function-try-block
= default ;
deleted-function-body
deleted-function-body:
= delete ;
= delete ( unevaluated-string ) ;
enum-specifier:
enum-head { enumerator-listopt }
enum-head { enumerator-list , }
enum-head:
enum-key attribute-specifier-seqopt enum-head-nameopt enum-baseopt
enum-head-name:
nested-name-specifieropt identifier
opaque-enum-declaration:
enum-key attribute-specifier-seqopt enum-head-name enum-baseopt ;
enum-key:
enum
enum class
enum struct
enumerator-list:
enumerator-definition
enumerator-list , enumerator-definition
enumerator-definition:
enumerator
enumerator = constant-expression
enumerator:
identifier attribute-specifier-seqopt
using-enum-declaration:
using enum using-enum-declarator ;
using-enum-declarator:
nested-name-specifieropt identifier
nested-name-specifieropt simple-template-id
splice-type-specifier
namespace-name:
identifier
namespace-alias
namespace-definition:
named-namespace-definition
unnamed-namespace-definition
nested-namespace-definition
named-namespace-definition:
inlineopt namespace attribute-specifier-seqopt identifier { namespace-body }
unnamed-namespace-definition:
inlineopt namespace attribute-specifier-seqopt { namespace-body }
nested-namespace-definition:
namespace enclosing-namespace-specifier :: inlineopt identifier { namespace-body }
enclosing-namespace-specifier:
identifier
enclosing-namespace-specifier :: inlineopt identifier
namespace-body:
declaration-seqopt
namespace-alias-definition:
namespace identifier = qualified-namespace-specifier ;
namespace identifier = splice-specifier ;
qualified-namespace-specifier:
nested-name-specifieropt namespace-name
using-directive:
attribute-specifier-seqopt using namespace nested-name-specifieropt namespace-name ;
attribute-specifier-seqopt using namespace splice-specifier ;
using-declaration:
using using-declarator-list ;
using-declarator-list:
using-declarator ...opt
using-declarator-list , using-declarator ...opt
using-declarator:
typenameopt nested-name-specifier unqualified-id
asm-declaration:
attribute-specifier-seqopt asm ( balanced-token-seq ) ;
linkage-specification:
extern unevaluated-string { declaration-seqopt }
extern unevaluated-string name-declaration
attribute-specifier-seq:
attribute-specifier attribute-specifier-seqopt
attribute-specifier:
[ [ attribute-using-prefixopt attribute-list ] ]
[ [ annotation-list ] ]
alignment-specifier
alignment-specifier:
alignas ( type-id ...opt )
alignas ( constant-expression ...opt )
attribute-using-prefix:
using attribute-namespace :
attribute-list:
attributeopt
attribute-list , attributeopt
attribute ...
attribute-list , attribute ...
annotation-list:
annotation ...opt
annotation-list , annotation ...opt
attribute:
attribute-token attribute-argument-clauseopt
annotation:
= constant-expression
attribute-token:
identifier
attribute-scoped-token
attribute-scoped-token:
attribute-namespace :: identifier
attribute-namespace:
identifier
attribute-argument-clause:
( balanced-token-seqopt )
balanced-token-seq:
balanced-token balanced-token-seqopt
balanced-token:
( balanced-token-seqopt )
[ balanced-token-seqopt ]
{ balanced-token-seqopt }
[: balanced-token-seqopt :]
any token other than (, ), [, ], {, }, [:, or :]