valores sentencia retorno retornan que programacion lenguaje funciones funcion ejemplos ejemplo c++ c++11 lambda trailing-return-type

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.