2012-08-26 19 views
5

cuando capture a un valor, pero el tipo de valor es una referencia en una función de plantillaC++ 11 lambda lista de captura [=] utilizar una referencia

template<class T> 
void test(T&&i) 
{ 
    ++i; 
    std::cout << i << std::endl; 
} 

template<class T> 
void typetest(T&& t) 
{ 
    ++t; 
    T t1(t); 
    [=]() mutable { std::cout << t1 << std::endl; return test(t1); }(); 
    std::cout << t << std::endl; 
} 

int main() 
{ 
    int i=1; 
    typetest(i); 
} 

imprime

2 
3 
2 

Pero en T t1(t);T es int& así que t1 debe ser int& cuando el lambda llama test(t1). ¿Por qué es la salida no

2 
3 
3 

Respuesta

7

T es int & por lo t1 debe ser int &

Las referencias no son punteros. T se puede deducir como int&, por lo tanto t1 es una referencia. Pero le pediste a la lambda que capturara t1 por valor. Eso significa copiar el valor al que hace referencia el t1.

Si t1 fuera un puntero, obtendría el puntero por valor. Pero no puede obtener una referencia "por valor"; solo puede obtener el valor al que se hace referencia.

+0

Pruebo en lambda. [=]() mutable {mytesttypecode (decltype (t1)); return test (t1);}(); y t1 es int &. algo no es bueno, creo ..... – user1625647

2

A través de la captura por valor [=] su lambda obtiene una copia local de t1 que pasa a test(), así que lo que sucede a t1 en el lambda no afectará a la t objeto original.

Cuestiones relacionadas