Ceci n'est pas une référence à une référence; il n'y a pas une telle chose.
Ce que vous voyez est un C++ 0x rvalue reference, désigné par double esperluette, &&
. Cela signifie que l'argument i
à la fonction est temporaire, de sorte que la fonction est autorisée à écraser ses données sans causer de problèmes dans le code appelant.
Exemple:
void function(int &i); // A
void function(int &&i); // B
int foo();
int main() {
int x = foo();
function(x); // calls A
function(foo()); // calls B, because the return value is a temporary
}
Ce rarement utile avec int
plaine s, mais très utile lors de la définition des constructeurs de mouvement, par exemple. Un constructeur de mouvement est comme un constructeur de copie, sauf qu'il peut «voler» en toute sécurité les données internes de l'objet original, parce que c'est un temporaire qui cessera d'exister après le retour du constructeur de mouvement.
Ah, ok. Merci pour la clarification. Comment est ce code en boost (1.42) en ce moment? Je crois comprendre que boost est actuellement écrit pour la norme C++ 03. –
@Silver: Il va tirer parti des fonctionnalités de certains compilateurs. Certains compilateurs supportent C++ 0x (un bit), et si Boost veut le détecter et l'utiliser, il le fera. – GManNickG
@SilverSun: Boost utilise la compilation conditionnelle (#if, etc.) pour personnaliser ce qui est disponible pour chaque compilateur. –