Namespaces
Namespaces är till för att dela upp global scope. Eftersom vi refererar till saker via namn så finns det en risk att vi definierar saker flera gånger. Namespace är liksom en prefix för att lägga ytterligare distinktion till vad för något blir refererat. Samma namn riskerar att referera till flera olika saker.
Man kan likna namespaces till ett virtuellt scope som inte påverkar lifetimes men som tydliggör referenser till definitionerna.
Creation
För att skapa ett nytt namespace har vi liknande syntax som att definiera ett nytt scope.
namespace X {
int Y = 0; // Y finns nu inuti namespace X
}
int Z = 1; // Z är utanför namespace X
Accessing
För att komma åt en variabel eller annat som finns inuti ett namespace refererar vi till namnet på vårt namespace och namnet på vår identifier (variabel namnet t.ex.).
namespace X {
// Y finns nu inuti namespace X och i global scope
int Y = 0; // ----+- 'y
} // |
int main() { // |
std::cout << X::Y << std::endl; // |
} // |
Global scope access
Som standard har vi syntax för att gå in i namespaces, men i vissa fall vill vi gå ut ur namespaces för att referera någonting. Specifikt är detta användbart med name conflict med en variabel i global scope och nuvarande namespace.
int X = 0;
namespace Y {
int X = 2;
…
X // 2
::X // 0
…
}
Vi använder syntaxen för att komma åt ett namespace, utan något namn, för att referera till global scope. Det är liksom en negation mot vår namespace nesting.