Chapitre 18 : espace de nom et référence r-value

Espace de nom

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.

EXEMPLE
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
}

Références r-value

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"

EXEMPLE
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