2010-04-18 9 views
11

Dans mes aventures d'étude des bibliothèques boost, j'ai rencontré des signatures de fonctions qui ont des paramètres qui font référence à une référence à un objet.Quel est le but de l'utilisation d'une référence à une référence en C++?

Exemple:

void function(int && i); 

Quel est le but/avantage de le faire de cette façon plutôt que de prendre simplement une référence à un objet? Je suppose qu'il y en a un s'il est boosté.

Répondre

18

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.

+0

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. –

+2

@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

+1

@SilverSun: Boost utilise la compilation conditionnelle (#if, etc.) pour personnaliser ce qui est disponible pour chaque compilateur. –

3

Ce n'est pas une référence à une référence. C'est une référence rvalue, qui est une nouvelle fonctionnalité supportée par le prochain standard C++ 0x.

2

Ce que vous regardez est une référence rvalue. C'est une nouvelle fonctionnalité de langage C++ 0x. Voir here ou moins formel here.

La proposition originale se trouve here