2010-04-18 11 views
11

En mis aventuras estudiando las bibliotecas de impulso, he encontrado firmas de funciones que tienen parámetros que hacen referencia a una referencia a un objeto.¿Cuál es el propósito de usar una referencia a una referencia en C++?

Ejemplo:

void function(int && i); 

Cuál es el propósito/beneficio de hacerlo de esta manera en lugar de simplemente tomar una referencia a un objeto? Supongo que hay uno si está en impulso.

Respuesta

18

Esto no es una referencia a una referencia; no existe tal cosa.

Lo que está viendo es un C++ 0x rvalue reference, denotado por dobles ampersands, &&. Significa que el argumento i de la función es temporal, por lo que la función puede bloquear sus datos sin causar problemas en el código de llamada.

Ejemplo:

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 
} 

Esto raramente útil con casquillos de int s, pero muy útil al definir constructores de movimiento, por ejemplo. Un constructor de movimientos es como un constructor de copias, excepto que puede 'robar' de forma segura los datos internos del objeto original, porque es un temporal que dejará de existir después de que el constructor de movimientos regrese.

+0

Ah, bien. Gracias por la aclaración. ¿Cómo está este código en alza (1.42) en este momento? Entiendo que el impulso está actualmente escrito para el estándar C++ 03. –

+2

@ Plata: Aprovechará las características de ciertos compiladores. Algunos compiladores admiten C++ 0x (un poco), y si Boost quiere detectar y usar eso, lo hará. – GManNickG

+1

@SilverSun: Boost usa la compilación condicional (#if, etc.) para personalizar lo que está disponible para cada compilador. –

3

No es una referencia a una referencia. Es una referencia rvalue, que es una nueva característica compatible con el próximo estándar C++ 0x.

2

Lo que está viendo es una referencia de valor. Es una nueva característica del lenguaje central de C++ 0x. Ver here o menos formaly here.

La propuesta original se puede encontrar here

Cuestiones relacionadas