243 lines
10 KiB
Markdown
243 lines
10 KiB
Markdown
[basic.pre]
|
||
|
||
# 6 Basics [[basic]](./#basic)
|
||
|
||
## 6.1 Preamble [basic.pre]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L13)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
This Clause presents the basic concepts of the C++ language[.](#1.sentence-1)
|
||
|
||
It explains the difference between an object and a
|
||
name and how they relate to the value categories for expressions[.](#1.sentence-2)
|
||
|
||
It introduces the concepts of a
|
||
declaration and a definition and presents C++'s
|
||
notion of type, scope, linkage, and
|
||
storage duration[.](#1.sentence-3)
|
||
|
||
The mechanisms for starting and
|
||
terminating a program are discussed[.](#1.sentence-4)
|
||
|
||
Finally, this Clause presents the
|
||
fundamental types of the language and lists the ways of constructing
|
||
compound types from these[.](#1.sentence-5)
|
||
|
||
â *end note*]
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L27)
|
||
|
||
[*Note [2](#note-2)*:
|
||
|
||
This Clause does not cover concepts that affect only a single
|
||
part of the language[.](#2.sentence-1)
|
||
|
||
Such concepts are discussed in the relevant
|
||
Clauses[.](#2.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L34)
|
||
|
||
A [*name*](basic.link#def:name "6.7 Program and linkage [basic.link]") is an [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") ([[lex.name]](lex.name "5.11 Identifiers")),[*conversion-function-id*](class.conv.fct#nt:conversion-function-id "11.4.8.3 Conversion functions [class.conv.fct]") ([[class.conv.fct]](class.conv.fct "11.4.8.3 Conversion functions")),[*operator-function-id*](over.oper.general#nt:operator-function-id "12.4.1 General [over.oper.general]") ([[over.oper]](over.oper "12.4 Overloaded operators")), or[*literal-operator-id*](over.literal#nt:literal-operator-id "12.6 User-defined literals [over.literal]") ([[over.literal]](over.literal "12.6 User-defined literals"))[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L40)
|
||
|
||
Two names are [*the same*](#def:name,same "6.1 Preamble [basic.pre]") if
|
||
|
||
- [(4.1)](#4.1)
|
||
|
||
they are [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")*s* composed of the same character sequence, or
|
||
|
||
- [(4.2)](#4.2)
|
||
|
||
they are [*conversion-function-id*](class.conv.fct#nt:conversion-function-id "11.4.8.3 Conversion functions [class.conv.fct]")*s* formed with
|
||
equivalent ([[temp.over.link]](temp.over.link "13.7.7.2 Function template overloading")) types, or
|
||
|
||
- [(4.3)](#4.3)
|
||
|
||
they are [*operator-function-id*](over.oper.general#nt:operator-function-id "12.4.1 General [over.oper.general]")*s* formed with
|
||
the same operator, or
|
||
|
||
- [(4.4)](#4.4)
|
||
|
||
they are [*literal-operator-id*](over.literal#nt:literal-operator-id "12.6 User-defined literals [over.literal]")*s* formed with
|
||
the same literal suffix identifier[.](#4.sentence-1)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L52)
|
||
|
||
Every name is introduced by a [*declaration*](#def:declaration "6.1 Preamble [basic.pre]"), which is a
|
||
|
||
- [(5.1)](#5.1)
|
||
|
||
[*name-declaration*](dcl.pre#nt:name-declaration "9.1 Preamble [dcl.pre]"),[*block-declaration*](dcl.pre#nt:block-declaration "9.1 Preamble [dcl.pre]"), or[*member-declaration*](class.mem.general#nt:member-declaration "11.4.1 General [class.mem.general]") ([[dcl.pre]](dcl.pre "9.1 Preamble"), [[class.mem]](class.mem "11.4 Class members")),
|
||
|
||
- [(5.2)](#5.2)
|
||
|
||
[*init-declarator*](dcl.decl.general#nt:init-declarator "9.3.1 General [dcl.decl.general]") ([[dcl.decl]](dcl.decl "9.3 Declarators")),
|
||
|
||
- [(5.3)](#5.3)
|
||
|
||
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") in a structured binding declaration ([[dcl.struct.bind]](dcl.struct.bind "9.7 Structured binding declarations")),
|
||
|
||
- [(5.4)](#5.4)
|
||
|
||
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") in a [*result-name-introducer*](dcl.contract.res#nt:result-name-introducer "9.4.2 Referring to the result object [dcl.contract.res]") in a postcondition assertion ([[dcl.contract.res]](dcl.contract.res "9.4.2 Referring to the result object")),
|
||
|
||
- [(5.5)](#5.5)
|
||
|
||
[*init-capture*](expr.prim.lambda.capture#nt:init-capture "7.5.6.3 Captures [expr.prim.lambda.capture]") ([[expr.prim.lambda.capture]](expr.prim.lambda.capture "7.5.6.3 Captures")),
|
||
|
||
- [(5.6)](#5.6)
|
||
|
||
[*condition*](stmt.pre#nt:condition "8.1 Preamble [stmt.pre]") with a [*declarator*](dcl.decl.general#nt:declarator "9.3.1 General [dcl.decl.general]") ([[stmt.pre]](stmt.pre "8.1 Preamble")),
|
||
|
||
- [(5.7)](#5.7)
|
||
|
||
[*member-declarator*](class.mem.general#nt:member-declarator "11.4.1 General [class.mem.general]") ([[class.mem]](class.mem "11.4 Class members")),
|
||
|
||
- [(5.8)](#5.8)
|
||
|
||
[*using-declarator*](namespace.udecl#nt:using-declarator "9.10 The using declaration [namespace.udecl]") ([[namespace.udecl]](namespace.udecl "9.10 The using declaration")),
|
||
|
||
- [(5.9)](#5.9)
|
||
|
||
[*parameter-declaration*](dcl.fct#nt:parameter-declaration "9.3.4.6 Functions [dcl.fct]") ([[dcl.fct]](dcl.fct "9.3.4.6 Functions"), [[temp.param]](temp.param "13.2 Template parameters")),
|
||
|
||
- [(5.10)](#5.10)
|
||
|
||
[*type-parameter*](temp.param#nt:type-parameter "13.2 Template parameters [temp.param]") ([[temp.param]](temp.param "13.2 Template parameters")),
|
||
|
||
- [(5.11)](#5.11)
|
||
|
||
[*type-tt-parameter*](temp.param#nt:type-tt-parameter "13.2 Template parameters [temp.param]") ([[temp.param]](temp.param "13.2 Template parameters")),
|
||
|
||
- [(5.12)](#5.12)
|
||
|
||
[*variable-tt-parameter*](temp.param#nt:variable-tt-parameter "13.2 Template parameters [temp.param]") ([[temp.param]](temp.param "13.2 Template parameters")),
|
||
|
||
- [(5.13)](#5.13)
|
||
|
||
[*concept-tt-parameter*](temp.param#nt:concept-tt-parameter "13.2 Template parameters [temp.param]") ([[temp.param]](temp.param "13.2 Template parameters")),
|
||
|
||
- [(5.14)](#5.14)
|
||
|
||
[*elaborated-type-specifier*](dcl.type.elab#nt:elaborated-type-specifier "9.2.9.5 Elaborated type specifiers [dcl.type.elab]") that introduces a name ([[dcl.type.elab]](dcl.type.elab "9.2.9.5 Elaborated type specifiers")),
|
||
|
||
- [(5.15)](#5.15)
|
||
|
||
[*class-specifier*](class.pre#nt:class-specifier "11.1 Preamble [class.pre]") ([[class.pre]](class.pre "11.1 Preamble")),
|
||
|
||
- [(5.16)](#5.16)
|
||
|
||
[*enum-specifier*](dcl.enum#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]") or[*enumerator-definition*](dcl.enum#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]") ([[dcl.enum]](dcl.enum "9.8.1 Enumeration declarations")),
|
||
|
||
- [(5.17)](#5.17)
|
||
|
||
[*exception-declaration*](except.pre#nt:exception-declaration "14.1 Preamble [except.pre]") ([[except.pre]](except.pre "14.1 Preamble")), or
|
||
|
||
- [(5.18)](#5.18)
|
||
|
||
implicit declaration of an injected-class-name ([[class.pre]](class.pre "11.1 Preamble"))[.](#5.sentence-1)
|
||
|
||
[*Note [3](#note-3)*:
|
||
|
||
The term declaration is not a synonym for the grammar non-terminal [*declaration*](dcl.pre#nt:declaration "9.1 Preamble [dcl.pre]") ([[dcl.pre]](dcl.pre "9.1 Preamble"))[.](#5.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[*Note [4](#note-4)*:
|
||
|
||
The interpretation of a [*for-range-declaration*](stmt.pre#nt:for-range-declaration "8.1 Preamble [stmt.pre]") produces
|
||
one or more of the above ([[stmt.ranged]](stmt.ranged "8.6.5 The range-based for statement"))[.](#5.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L107)
|
||
|
||
[*Note [5](#note-5)*:
|
||
|
||
Some names denote types or templates[.](#6.sentence-1)
|
||
|
||
In general, whenever a name is encountered
|
||
it is necessary to look it up ([[basic.lookup]](basic.lookup "6.5 Name lookup"))
|
||
to determine whether that name denotes one of these entities
|
||
before continuing to parse the program that contains it[.](#6.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L116)
|
||
|
||
A [*variable*](#def:variable "6.1 Preamble [basic.pre]") is introduced by the
|
||
declaration of
|
||
a reference other than a non-static data member or of
|
||
an object[.](#7.sentence-1)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L122)
|
||
|
||
An [*entity*](#def:entity "6.1 Preamble [basic.pre]") is a
|
||
variable,
|
||
structured binding,
|
||
result binding,
|
||
function,
|
||
enumerator,
|
||
type,
|
||
type alias,
|
||
non-static data member,
|
||
bit-field,
|
||
template,
|
||
namespace,
|
||
namespace alias,
|
||
template parameter,
|
||
function parameter, or[*init-capture*](expr.prim.lambda.capture#nt:init-capture "7.5.6.3 Captures [expr.prim.lambda.capture]")[.](#8.sentence-1)
|
||
|
||
The [*underlying entity*](#def:entity,underlying "6.1 Preamble [basic.pre]") of an entity is that entity
|
||
unless otherwise specified[.](#8.sentence-2)
|
||
|
||
A name [*denotes*](#def:denote "6.1 Preamble [basic.pre]") the underlying entity of
|
||
the entity declared by each declaration that introduces the name[.](#8.sentence-3)
|
||
|
||
[*Note [6](#note-6)*:
|
||
|
||
Type aliases and namespace aliases have underlying entities
|
||
that are distinct from themselves[.](#8.sentence-4)
|
||
|
||
â *end note*]
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L148)
|
||
|
||
A [*local entity*](#def:entity,local "6.1 Preamble [basic.pre]") is a variable with
|
||
automatic storage duration ([[basic.stc.auto]](basic.stc.auto "6.8.6.4 Automatic storage duration")),
|
||
a structured binding ([[dcl.struct.bind]](dcl.struct.bind "9.7 Structured binding declarations"))
|
||
whose corresponding variable is such an entity,
|
||
a result binding ([[dcl.contract.res]](dcl.contract.res "9.4.2 Referring to the result object")),
|
||
or the *this object ([[expr.prim.this]](expr.prim.this "7.5.3 This"))[.](#9.sentence-1)
|
||
|
||
[10](#10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L156)
|
||
|
||
A name used in more than one translation unit can potentially
|
||
refer to the same entity in these translation units depending on the[linkage](basic.link "6.7 Program and linkage [basic.link]") of the name specified in each
|
||
translation unit[.](#10.sentence-1)
|