201 votes

Opérateur d'adresse double en C++ ? (&&)

Je lis le code source de la STL et je n'ai aucune idée de ce que && l'opérateur d'adresse 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;
}

L'expression "adresse de l'adresse" a-t-elle un sens ? Pourquoi y a-t-il deux opérateurs d'adresse au lieu d'un seul ?

3 votes

C'est peut-être l'adresse d'une référence.

2 votes

@Gabe ; il s'agit d'une déclaration, ce qui en ferait une référence à une référence, ce qui n'a aucun sens puisque la référence elle-même ne peut pas être modifiée. L'adresse-of ne peut être utilisée que dans le code, pas lors de la déclaration (un paramètre comme dans ce cas, ou autre). Je n'ai jamais vu quelque chose comme ça cependant.

5 votes

Même s'il n'y avait qu'un seul & cela n'aurait rien à voir avec l'opérateur address-of, mais signifierait plutôt que __x est une référence.

279voto

Lexseal Lin Points 2582

&& 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 seulement prend une expression de valeur r. Si vous ne savez pas ce qu'est une valeur r, l'explication simple est qu'elle n'a pas d'adresse mémoire. Par exemple, le chiffre 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 instructif.

18 votes

Le seul exemple que j'aimerais que vous ajoutiez est celui de la façon dont cela fonctionne avec std::move. Montrer ce qui se passerait avec int&& c = std::move( b ); , etc.

21 votes

On dirait que Sravani S plagié de façon flagrante pour TutorialsPoint le 15 février 2018, aquí .

14 votes

Je viens d'envoyer à TutorialsPoint ce message . L'article, tel qu'il a été plagié par eux, ressemble à ceci .

131voto

aschepler Points 23731

C'est C++11 code. En C++11, le && peut être utilisé pour signifier une "référence à une valeur réelle".

101voto

Billy ONeal Points 50631

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

0 votes

@bronekk : Avez-vous vu la date de publication de ce message ? Il n'a pas été publié à partir du 28 décembre 2010.

0 votes

Désolé pour ça, enlevé maintenant. Je ferai plus attention la prochaine fois :)

38voto

Michael Burr Points 181287

Comme d'autres réponses l'ont mentionné, le && Dans ce contexte, les jetons sont nouveaux pour C++0x (la prochaine norme C++) et représentent une "référence rvalue".

Les références Rvalue sont l'une des nouveautés les plus importantes de la prochaine norme ; elles permettent de prendre en charge la sémantique de "déplacement" des objets et de transférer parfaitement les appels de fonction.

C'est un sujet assez complexe - l'une des meilleures introductions (qui ne soit pas simplement superficielle) est un article de Stephan T. Lavavej, "Références Rvalue : Caractéristiques de C++0x dans la VC10, partie 2 "

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

0 votes

Le site && Le jeton en lui-même n'est pas nouveau ; sa signification dans les déclarations l'est. Mais vous le saviez.

0 votes

C'est nouveau dans ce contexte. Mais il est très traditionnel pour C/C++ de surcharger ses jetons pour qu'ils aient une signification différente dans des contextes différents.

1 votes

@aschkleper - bien sûr... l'opérateur logique-et n'a même pas effleuré mon esprit. Je vais mettre à jour la réponse.

6voto

yash101 Points 74

Je crois que c'est un opérateur de déménagement. operator= est l'opérateur d'affectation, disons vector x = vector y . El clear() semble effacer le contenu du vecteur pour éviter une fuite de mémoire. L'opérateur renvoie un pointeur vers 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 au vecteur a, le vecteur b a les valeurs. C'est la magie du operator=() !

MSDN -- Comment créer un constructeur de mouvement

1 votes

Qu'est-ce que votre réponse ajoute à cette question vieille de 4 ans, qui n'a pas déjà été abordée dans les autres réponses ?

7 votes

Je n'ai pas trouvé de réponse à cette question, alors j'ai décidé d'en ajouter une. Je suis tombée sur cette question en faisant une recherche sur Google aujourd'hui même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X