Annex A (informative) Grammar summary [gram]

A.6 Declarations [gram.dcl]

declaration-seq:
declaration
declaration-seq declaration
declaration:
block-declaration
nodeclspec-function-declaration
function-definition
template-declaration
deduction-guide
explicit-instantiation
explicit-specialization
export-declaration
linkage-specification
namespace-definition
empty-declaration
attribute-declaration
module-import-declaration
block-declaration:
simple-declaration
asm-declaration
namespace-alias-definition
using-declaration
using-enum-declaration
using-directive
static_assert-declaration
alias-declaration
opaque-enum-declaration
nodeclspec-function-declaration:
attribute-specifier-seq declarator ;
alias-declaration:
using identifier attribute-specifier-seq = defining-type-id ;
simple-declaration:
decl-specifier-seq init-declarator-list ;
attribute-specifier-seq decl-specifier-seq init-declarator-list ;
attribute-specifier-seq decl-specifier-seq ref-qualifier [ identifier-list ] initializer ;
static_assert-declaration:
static_­assert ( constant-expression ) ;
static_­assert ( constant-expression , string-literal ) ;
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-seq
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-seq
type-specifier type-specifier-seq
defining-type-specifier:
type-specifier
class-specifier
enum-specifier
defining-type-specifier-seq:
defining-type-specifier attribute-specifier-seq
defining-type-specifier defining-type-specifier-seq
simple-type-specifier:
nested-name-specifier type-name
nested-name-specifier template simple-template-id
decltype-specifier
placeholder-type-specifier
nested-name-specifier 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
elaborated-type-specifier:
class-key attribute-specifier-seq nested-name-specifier identifier
class-key simple-template-id
class-key nested-name-specifier template simple-template-id
elaborated-enum-specifier
elaborated-enum-specifier:
enum nested-name-specifier identifier
decltype-specifier:
decltype ( expression )
placeholder-type-specifier:
type-constraint auto
type-constraint decltype ( auto )
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator initializer
declarator requires-clause
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-seq
noptr-declarator parameters-and-qualifiers
noptr-declarator [ constant-expression ] attribute-specifier-seq
( ptr-declarator )
parameters-and-qualifiers:
( parameter-declaration-clause ) cv-qualifier-seq
   ref-qualifier noexcept-specifier attribute-specifier-seq
trailing-return-type:
-> type-id
ptr-operator:
* attribute-specifier-seq cv-qualifier-seq
& attribute-specifier-seq
&& attribute-specifier-seq
nested-name-specifier * attribute-specifier-seq cv-qualifier-seq
cv-qualifier-seq:
cv-qualifier cv-qualifier-seq
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
... id-expression
type-id:
type-specifier-seq abstract-declarator
defining-type-id:
defining-type-specifier-seq abstract-declarator
abstract-declarator:
ptr-abstract-declarator
noptr-abstract-declarator parameters-and-qualifiers trailing-return-type
abstract-pack-declarator
ptr-abstract-declarator:
noptr-abstract-declarator
ptr-operator ptr-abstract-declarator
noptr-abstract-declarator:
noptr-abstract-declarator parameters-and-qualifiers
noptr-abstract-declarator [ constant-expression ] attribute-specifier-seq
( 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
noptr-abstract-pack-declarator [ constant-expression ] attribute-specifier-seq
...
parameter-declaration-clause:
parameter-declaration-list ...
parameter-declaration-list , ...
parameter-declaration-list:
parameter-declaration
parameter-declaration-list , parameter-declaration
parameter-declaration:
attribute-specifier-seq decl-specifier-seq declarator
attribute-specifier-seq decl-specifier-seq declarator = initializer-clause
attribute-specifier-seq decl-specifier-seq abstract-declarator
attribute-specifier-seq decl-specifier-seq abstract-declarator = initializer-clause
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 , }
{ designated-initializer-list , }
{ }
initializer-list:
initializer-clause ...
initializer-list , initializer-clause ...
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-seq decl-specifier-seq declarator virt-specifier-seq function-body
attribute-specifier-seq decl-specifier-seq declarator requires-clause function-body
function-body:
ctor-initializer compound-statement
function-try-block
= default ;
= delete ;
enum-name:
identifier
enum-specifier:
enum-head { enumerator-list }
enum-head { enumerator-list , }
enum-head:
enum-key attribute-specifier-seq enum-head-name enum-base
enum-head-name:
nested-name-specifier identifier
opaque-enum-declaration:
enum-key attribute-specifier-seq enum-head-name enum-base ;
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-seq
using-enum-declaration:
using elaborated-enum-specifier ;
namespace-name:
identifier
namespace-alias
namespace-definition:
named-namespace-definition
unnamed-namespace-definition
nested-namespace-definition
named-namespace-definition:
inline namespace attribute-specifier-seq identifier { namespace-body }
unnamed-namespace-definition:
inline namespace attribute-specifier-seq { namespace-body }
nested-namespace-definition:
namespace enclosing-namespace-specifier :: inline identifier { namespace-body }
enclosing-namespace-specifier:
identifier
enclosing-namespace-specifier :: inline identifier
namespace-body:
declaration-seq
namespace-alias:
identifier
namespace-alias-definition:
namespace identifier = qualified-namespace-specifier ;
qualified-namespace-specifier:
nested-name-specifier namespace-name
using-directive:
attribute-specifier-seq using namespace nested-name-specifier namespace-name ;
using-declaration:
using using-declarator-list ;
using-declarator-list:
using-declarator ...
using-declarator-list , using-declarator ...
using-declarator:
typename nested-name-specifier unqualified-id
asm-declaration:
attribute-specifier-seq asm ( string-literal ) ;
linkage-specification:
extern string-literal { declaration-seq }
extern string-literal declaration
attribute-specifier-seq:
attribute-specifier-seq attribute-specifier
attribute-specifier:
[ [ attribute-using-prefix attribute-list ] ]
alignment-specifier
alignment-specifier:
alignas ( type-id ... )
alignas ( constant-expression ... )
attribute-using-prefix:
using attribute-namespace :
attribute-list:
attribute
attribute-list , attribute
attribute ...
attribute-list , attribute ...
attribute:
attribute-token attribute-argument-clause
attribute-token:
identifier
attribute-scoped-token
attribute-scoped-token:
attribute-namespace :: identifier
attribute-namespace:
identifier
attribute-argument-clause:
( balanced-token-seq )
balanced-token-seq:
balanced-token
balanced-token-seq balanced-token
balanced-token:
( balanced-token-seq )
[ balanced-token-seq ]
{ balanced-token-seq }
any token other than a parenthesis, a bracket, or a brace