On peut englober des déclarations globales dans un espace de nom avec le mot-clé namespace et ensuite accéder à ces déclarations avec :: ou using.
int a = 1; //::a
namespace A{
void f(){cout << "A::f()" << endl;} //A::f
namespace B{
int a = 2; //A::B::a
void f(){cout << "A::B::f()" << endl;} // A::B::f
}
}
namespace A{
int a =3; //A::a;
}
namespace A{
int a = 4; // !!!probleme : redefinition de A::a
}
//int a=5; // !!!meme probleme
void f(){cout << "::f()" << endl;}
int main(){
a; //vaut 1
A::a; //vaut 3
using A::B::a;
a; //vaut 2
::a; //vaut 1
::f(); // affiche ::f()
A::B::f(); //affiche A::B::f()
f(); //affiche ::f()
}
void g(){
using namespace A::B;
a; //vaut 2
f(); //affiche A::B::f
namespace toto = A;
toto::a; //vaut 3, represente //A::a
}
Si A est une expression de type, on peut définir une r-value référence sur A avec la syntaxe A&&
Une r-value référence doit être initialisée à sa création avec une valeur de type A qui "ne possède pas d'adresse"
A obj{...};
A f(...); // fonction qui renvoie A;
A& rob = obj; //ok
A obj2 = obj; //constructeur de copie
A obj3 = f(...); // constructeur par copie
A& r2obj = f(...); // erreur
A&& rrobj = f(...); //ok, pas d'appel au constructeur de copie
A&& rrobj2 = obj; //erreur
int&& a = 3; //ok