web-dev-qa-db-fra.com

Opérateur double adresse C ++? (&&)

Je lis le code source STL et je n'ai aucune idée de ce que && adresse opérateur est censé faire. Voici un exemple de code tiré de stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

"Adresse" a-t-il un sens? Pourquoi a-t-il deux opérateurs d'adresse au lieu d'un seul?

108
Anarki

C'est C++ 11 code. En C++ 11, le && jeton peut être utilisé pour désigner une "référence rvalue".

94
aschepler

&& est nouveau dans C++ 11. int&& a signifie que "a" est une référence de valeur r. && n'est normalement utilisé que pour déclarer un paramètre d'une fonction. Et il niquement prend une expression de valeur r. Si vous ne savez pas ce qu'est une valeur r, l'explication simple est qu'il ne possède pas d'adresse mémoire. Par exemple. le nombre 6 et le caractère 'v' sont tous deux des valeurs-r. int a, a est une valeur l, cependant (a+2) est une valeur-r. Par exemple:

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

J'espère que c'est informatif.

119
Lexseal Lin

&& est nouveau dans C++ 11 et signifie que la fonction accepte un RValue-Reference - c'est-à-dire une référence à un argument sur le point d'être détruit.

81
Billy ONeal

Comme d'autres réponses l'ont mentionné, le jeton && Dans ce contexte est nouveau pour C++ 0x (le prochain standard C++) et représente une "référence rvalue".

Les références Rvalue sont l’une des nouveautés les plus importantes de la prochaine norme; ils permettent la prise en charge de la sémantique de déplacement sur les objets et permettent un transfert parfait des appels de fonction.

C'est un sujet assez complexe - une des meilleures introductions (non seulement sommaire) est un article de Stephan T. Lavavej, "Références Rvalue: C++ 0x Fonctionnalités dans VC10, partie 2"

Notez que l'article est toujours assez lourd à lire, mais en vaut la peine. Et même s’il s’agit d’un blog Microsoft VC++, toutes les informations (ou presque toutes) sont applicables à n’importe quel compilateur C++ 0x.

29
Michael Burr

Je crois que c’est un opérateur de déménagement. operator= Est l'opérateur d'affectation, disons vector x = vector y. L'appel à la fonction clear() ressemble à une suppression du contenu du vecteur afin d'éviter une fuite de mémoire. L'opérateur renvoie un pointeur sur le nouveau vecteur.

Par ici,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

Même si nous avons donné des valeurs de vecteur a, le vecteur b a les valeurs. C'est la magie de la operator=()!

MSDN - Comment créer un constructeur de déplacements

1
yash101