144 lines
11 KiB
Markdown
144 lines
11 KiB
Markdown
[dcl.decl.general]
|
||
|
||
# 9 Declarations [[dcl]](./#dcl)
|
||
|
||
## 9.3 Declarators [[dcl.decl]](dcl.decl#general)
|
||
|
||
### 9.3.1 General [dcl.decl.general]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L2376)
|
||
|
||
A declarator declares a single variable, function, or type, within a declaration[.](#1.sentence-1)
|
||
|
||
The[*init-declarator-list*](#nt:init-declarator-list "9.3.1 General [dcl.decl.general]") appearing in a [*simple-declaration*](dcl.pre#nt:simple-declaration "9.1 Preamble [dcl.pre]") is a comma-separated sequence of declarators,
|
||
each of which can have an initializer[.](#1.sentence-2)
|
||
|
||
[init-declarator-list:](#nt:init-declarator-list "9.3.1 General [dcl.decl.general]")
|
||
[*init-declarator*](#nt:init-declarator "9.3.1 General [dcl.decl.general]")
|
||
[*init-declarator-list*](#nt:init-declarator-list "9.3.1 General [dcl.decl.general]") , [*init-declarator*](#nt:init-declarator "9.3.1 General [dcl.decl.general]")
|
||
|
||
[init-declarator:](#nt:init-declarator "9.3.1 General [dcl.decl.general]")
|
||
[*declarator*](#nt:declarator "9.3.1 General [dcl.decl.general]") [*initializer*](dcl.init.general#nt:initializer "9.5.1 General [dcl.init.general]")
|
||
[*declarator*](#nt:declarator "9.3.1 General [dcl.decl.general]") [*requires-clause*](temp.pre#nt:requires-clause "13.1 Preamble [temp.pre]")opt [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1 General [dcl.contract.func]")opt
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L2396)
|
||
|
||
In all contexts, a [*declarator*](#nt:declarator "9.3.1 General [dcl.decl.general]") is interpreted as given below[.](#2.sentence-1)
|
||
|
||
Where an [*abstract-declarator*](dcl.name#nt:abstract-declarator "9.3.2 Type names [dcl.name]") can be used (or omitted)
|
||
in place of a [*declarator*](#nt:declarator "9.3.1 General [dcl.decl.general]") ([[dcl.fct]](dcl.fct "9.3.4.6 Functions"), [[except.pre]](except.pre "14.1 Preamble")),
|
||
it is as if a unique identifier were included in
|
||
the appropriate place ([[dcl.name]](dcl.name "9.3.2 Type names"))[.](#2.sentence-2)
|
||
|
||
The preceding specifiers indicate
|
||
the type, storage duration, linkage, or other properties
|
||
of the entity or entities being declared[.](#2.sentence-3)
|
||
|
||
Each declarator specifies one entity and
|
||
(optionally) names it and/or
|
||
modifies the type of the specifiers with operators such as* (pointer to) and () (function returning)[.](#2.sentence-4)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
An [*init-declarator*](#nt:init-declarator "9.3.1 General [dcl.decl.general]") can also specify an initializer ([[dcl.init]](dcl.init "9.5 Initializers"))[.](#2.sentence-5)
|
||
|
||
â *end note*]
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L2413)
|
||
|
||
Each [*init-declarator*](#nt:init-declarator "9.3.1 General [dcl.decl.general]") or [*member-declarator*](class.mem.general#nt:member-declarator "11.4.1 General [class.mem.general]") in a declaration is analyzed separately as if it were in a declaration by itself[.](#3.sentence-1)
|
||
|
||
[*Note [2](#note-2)*:
|
||
|
||
A declaration with several declarators is usually equivalent to the corresponding
|
||
sequence of declarations each with a single declarator[.](#3.sentence-2)
|
||
|
||
That is,T D1, D2, ... Dn; is usually equivalent toT D1; T D2; ... T Dn; where T is a [*decl-specifier-seq*](dcl.spec.general#nt:decl-specifier-seq "9.2.1 General [dcl.spec.general]") and each Di is
|
||
an [*init-declarator*](#nt:init-declarator "9.3.1 General [dcl.decl.general]") or [*member-declarator*](class.mem.general#nt:member-declarator "11.4.1 General [class.mem.general]")[.](#3.sentence-3)
|
||
|
||
One exception is when a name introduced by one of the[*declarator*](#nt:declarator "9.3.1 General [dcl.decl.general]")*s* hides a type name used by the[*decl-specifier*](dcl.spec.general#nt:decl-specifier "9.2.1 General [dcl.spec.general]")*s*, so that when the same[*decl-specifier*](dcl.spec.general#nt:decl-specifier "9.2.1 General [dcl.spec.general]")*s* are used in a subsequent declaration,
|
||
they do not have the same meaning, as instruct S { /* ... */ };
|
||
S S, T; // declare two instances of struct S which is not equivalent tostruct S { /* ... */ };
|
||
S S;
|
||
S T; // error
|
||
|
||
Another exception is when T is auto ([[dcl.spec.auto]](dcl.spec.auto "9.2.9.7 Placeholder type specifiers")),
|
||
for example:auto i = 1, j = 2.0; // error: deduced types for i and j do not match as opposed toauto i = 1; // OK, i deduced to have type intauto j = 2.0; // OK, j deduced to have type double
|
||
|
||
â *end note*]
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L2456)
|
||
|
||
The optional [*requires-clause*](temp.pre#nt:requires-clause "13.1 Preamble [temp.pre]") in an[*init-declarator*](#nt:init-declarator "9.3.1 General [dcl.decl.general]") or [*member-declarator*](class.mem.general#nt:member-declarator "11.4.1 General [class.mem.general]") shall be present only if the declarator declares a
|
||
templated function ([[temp.pre]](temp.pre "13.1 Preamble"))[.](#4.sentence-1)
|
||
|
||
When present after a declarator, the [*requires-clause*](temp.pre#nt:requires-clause "13.1 Preamble [temp.pre]") is called the [*trailing* ](#def:requires-clause,trailing "9.3.1 General [dcl.decl.general]")*[*requires-clause*](temp.pre#nt:requires-clause "13.1 Preamble [temp.pre]")*[.](#4.sentence-2)
|
||
|
||
The trailing [*requires-clause*](temp.pre#nt:requires-clause "13.1 Preamble [temp.pre]") introduces the[*constraint-expression*](temp.constr.decl#nt:constraint-expression "13.5.3 Constrained declarations [temp.constr.decl]") that results from interpreting
|
||
its [*constraint-logical-or-expression*](temp.pre#nt:constraint-logical-or-expression "13.1 Preamble [temp.pre]") as a[*constraint-expression*](temp.constr.decl#nt:constraint-expression "13.5.3 Constrained declarations [temp.constr.decl]")[.](#4.sentence-3)
|
||
|
||
[*Example [1](#example-1)*: void f1(int a) requires true; // error: non-templated functiontemplate<typename T>auto f2(T a) -> bool requires true; // OKtemplate<typename T>auto f3(T a) requires true -> bool; // error: [*requires-clause*](temp.pre#nt:requires-clause "13.1 Preamble [temp.pre]") precedes [*trailing-return-type*](#nt:trailing-return-type "9.3.1 General [dcl.decl.general]")void (*pf)() requires true; // error: constraint on a variablevoid g(int (*)() requires true); // error: constraint on a [*parameter-declaration*](dcl.fct#nt:parameter-declaration "9.3.4.6 Functions [dcl.fct]")auto* p = new void(*)(char) requires true; // error: not a function declaration â *end example*]
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L2485)
|
||
|
||
The optional [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1 General [dcl.contract.func]") ([[dcl.contract.func]](dcl.contract.func "9.4.1 General"))
|
||
in an [*init-declarator*](#nt:init-declarator "9.3.1 General [dcl.decl.general]") shall be present only if
|
||
the [*declarator*](#nt:declarator "9.3.1 General [dcl.decl.general]") declares a function[.](#5.sentence-1)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L2491)
|
||
|
||
Declarators have the syntax
|
||
|
||
[declarator:](#nt:declarator "9.3.1 General [dcl.decl.general]")
|
||
[*ptr-declarator*](#nt:ptr-declarator "9.3.1 General [dcl.decl.general]")
|
||
[*noptr-declarator*](#nt:noptr-declarator "9.3.1 General [dcl.decl.general]") [*parameters-and-qualifiers*](#nt:parameters-and-qualifiers "9.3.1 General [dcl.decl.general]") [*trailing-return-type*](#nt:trailing-return-type "9.3.1 General [dcl.decl.general]")
|
||
|
||
[ptr-declarator:](#nt:ptr-declarator "9.3.1 General [dcl.decl.general]")
|
||
[*noptr-declarator*](#nt:noptr-declarator "9.3.1 General [dcl.decl.general]")
|
||
[*ptr-operator*](#nt:ptr-operator "9.3.1 General [dcl.decl.general]") [*ptr-declarator*](#nt:ptr-declarator "9.3.1 General [dcl.decl.general]")
|
||
|
||
[noptr-declarator:](#nt:noptr-declarator "9.3.1 General [dcl.decl.general]")
|
||
[*declarator-id*](#nt:declarator-id "9.3.1 General [dcl.decl.general]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt
|
||
[*noptr-declarator*](#nt:noptr-declarator "9.3.1 General [dcl.decl.general]") [*parameters-and-qualifiers*](#nt:parameters-and-qualifiers "9.3.1 General [dcl.decl.general]")
|
||
[*noptr-declarator*](#nt:noptr-declarator "9.3.1 General [dcl.decl.general]") [ [*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]")opt ] [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt
|
||
( [*ptr-declarator*](#nt:ptr-declarator "9.3.1 General [dcl.decl.general]") )
|
||
|
||
[parameters-and-qualifiers:](#nt:parameters-and-qualifiers "9.3.1 General [dcl.decl.general]")
|
||
( [*parameter-declaration-clause*](dcl.fct#nt:parameter-declaration-clause "9.3.4.6 Functions [dcl.fct]") ) [*cv-qualifier-seq*](#nt:cv-qualifier-seq "9.3.1 General [dcl.decl.general]")opt
|
||
[*ref-qualifier*](#nt:ref-qualifier "9.3.1 General [dcl.decl.general]")opt [*noexcept-specifier*](except.spec#nt:noexcept-specifier "14.5 Exception specifications [except.spec]")opt [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt
|
||
|
||
[trailing-return-type:](#nt:trailing-return-type "9.3.1 General [dcl.decl.general]")
|
||
-> [*type-id*](dcl.name#nt:type-id "9.3.2 Type names [dcl.name]")
|
||
|
||
[ptr-operator:](#nt:ptr-operator "9.3.1 General [dcl.decl.general]")
|
||
* [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*cv-qualifier-seq*](#nt:cv-qualifier-seq "9.3.1 General [dcl.decl.general]")opt
|
||
& [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt
|
||
&& [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt
|
||
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") * [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*cv-qualifier-seq*](#nt:cv-qualifier-seq "9.3.1 General [dcl.decl.general]")opt
|
||
|
||
[cv-qualifier-seq:](#nt:cv-qualifier-seq "9.3.1 General [dcl.decl.general]")
|
||
[*cv-qualifier*](#nt:cv-qualifier "9.3.1 General [dcl.decl.general]") [*cv-qualifier-seq*](#nt:cv-qualifier-seq "9.3.1 General [dcl.decl.general]")opt
|
||
|
||
[cv-qualifier:](#nt:cv-qualifier "9.3.1 General [dcl.decl.general]")
|
||
const
|
||
volatile
|
||
|
||
[ref-qualifier:](#nt:ref-qualifier "9.3.1 General [dcl.decl.general]")
|
||
&
|
||
&&
|
||
|
||
[declarator-id:](#nt:declarator-id "9.3.1 General [dcl.decl.general]")
|
||
...opt [*id-expression*](expr.prim.id.general#nt:id-expression "7.5.5.1 General [expr.prim.id.general]")
|