[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)