Quelle est la référence R-Value qui est sur le point de venir dans la norme suivante c ++?
-
21-08-2019 - |
Question
Qu'est-ce que la référence R-Value qui est sur le point d'entrer dans le prochain standard C ++?
La solution 3
Voici une très longue article de Stephan T. Lavavej
Autres conseils
Jetez un oeil à Pourquoi C ++ 0x référence rvalue non la valeur par défaut? , ce qui explique assez bien leur utilisation pratique.
Il vous permet de distinguer entre le code qui vous a appelé en passant une référence à une valeur r ou l valeur. Par exemple:
void foo(int &x);
foo(1); // we are calling here with the r-value 1. This would be a compilation error
int x=1;
foo(x); // we are calling here with the l-value x. This is ok
En utilisant une référence valeur r, nous pouvons laisser passer des références à, comme dans temporaires le premier exemple ci-dessus:
void foo(int &&x); // x is an r-value reference
foo(1); // will call the r-value version
int x=1;
foo(x); // will call the l-value version
Ceci est plus intéressant quand nous sommes désireux de passer la valeur de retour d'une fonction qui crée un objet à une autre fonction qui utilise cet objet.
std::vector create_vector(); // creates and returns a new vector
void consume_vector(std::vector &&vec); // consumes the vector
consume_vector(create_vector()); // only the "move constructor" needs to be invoked, if one is defined
Le constructeur de déplacement agit comme le constructeur de copie, mais elle est définie pour prendre une référence de valeur de r plutôt que d'une l-value référence (const). Il est permis d'utiliser la sémantique valeur r pour déplacer les données de la temporaire créée en et les pousser create_vector
dans l'argument sans faire une consume_vector
copie coûteuse de toutes les données dans le vecteur.