c++ - sentencia - valores de retorno en programacion
¿Es posible devolver un objeto de tipo T por referencia desde un lambda sin usar la sintaxis de tipo de retorno final? (3)
Dado el siguiente fragmento de código:
struct T {};
std::function<T&(T&)> f = [](T& obj) -> T& { return obj; };
Me preguntaba si es posible inferir el tipo de retorno lambda correcto (es decir, T&
) sin utilizar la sintaxis de tipo de retorno final .
Obviamente, si elimino -> T&
luego se producirá un error en tiempo de compilación en el que el tipo deducido sería T
En C ++ 11, puede usar la función std :: ref para lograr lo que pidió:
#include <iostream>
#include <functional>
struct T {
int mI = 0;
};
int main() {
std::function<T&(T&)> foo = [](T&t) { return std::ref(t); };
T tObj;
T & tRef = foo(tObj);
tRef.mI = 42;
std::cout<<tObj.mI<<"/n"; // Returns 42
std::cout<<tRef.mI<<"/n"; // Returns 42
return 0;
}
La función
template<class T>
std::reference_wrapper<T> std::ref(T& t)
devuelve un objeto reference_wrapper, que básicamente es un objeto que contiene un puntero. Esta envoltura de referencia se puede convertir implícitamente a la referencia correspondiente, consulte cppreference.com
Además, podría reemplazar std::function<T&(T&)>
por auto
:
auto foo = [] (T& t) { return std::ref(t); };
En C ++ 14, puede usar [](T& obj) -> decltype(auto) { return obj; }
[](T& obj) -> decltype(auto) { return obj; }
. En ese caso, el tipo de devolución de f
se deduce del tipo de obj
declarado (es decir, T&
en este caso).
No, pero en C ++ 14 puedes usar auto&
como trailing-return-type . Si está preocupado por la escritura, y las actualizaciones del compilador no le preocupan en absoluto, entonces esto soluciona su problema.