Files
2025-10-25 03:02:53 +03:00

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

empty-declaration:
;

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

ptr-operator:

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

designator:
. identifier

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-name:
identifier

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

enum-base:
type-specifier-seq

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:
identifier

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 :]