c++ - examples - El tipo de retorno de una lambda puede deducirse por el valor de retorno, entonces, ¿por qué no puede una función?
lambda examples c++ (5)
Esto es solo una limitación de cómo se creó y evolucionó el lenguaje. En el próximo estándar C ++ 14, el tipo de retorno de una función se puede deducir en algunos contextos, aunque no en todos. Hay complicaciones cuando hay declaraciones de devoluciones múltiples.
Además, los tipos de retorno deducidos tienen otros problemas, por ejemplo, el tipo de retorno de una función de plantilla no puede usarse en un contexto SFINAE , ya que para poder deducir el tipo, el compilador debe crear una instancia de la plantilla de función, que ocurre después de la sustitución. El resultado neto es que, si bien la característica estará presente en un futuro cercano, la evitaría si puede proporcionar el tipo usted mismo.
#include <iostream>
int main(){
auto lambda = [] {
return 7;
};
std::cout << lambda() << ''/n'';
}
Este programa compila e imprime 7.
El tipo de retorno de lambda se deduce al tipo entero en función del valor de retorno de 7.
¿Por qué no es esto posible con las funciones ordinarias?
#include <iostream>
auto function(){
return 42;
}
int main(){
std::cout << function() << ''/n'';
}
error: la función ''función'' utiliza el especificador de tipo ''auto'' sin el tipo de retorno final
Esto viene en c ++ 14. Vea la siguiente proposal .
Mi suposición es que probablemente sea porque las lambdas inferidas de tipo no pueden ser recursivas .
¿Por qué importa esto? Porque si un lambda inferido de tipo podría ser recursivo (me refiero a "tipo inferido" donde el nombre de la variable es de tipo auto
), entonces su tipo de retorno podría potencialmente depender de sí mismo, y aunque a veces es posible resolverlo, mucho más difícil de implementar que la inferencia de tipo "simple". Ni siquiera estoy seguro de si siempre se puede resolver (¿es decidible en el caso general?). Sin embargo, si las funciones son compatibles con la inferencia de tipo, este problema debería tenerse en cuenta, por lo que es probable que simplemente los excluyan por este motivo.
Todavía no está ahí ... va a estar en C ++ 1y / C ++ 14 .. echa un vistazo a este enlace de función
C ++ 14 tiene esta característica . Puede probarlo con nuevas versiones de GCC o clang configurando el -std=c++1y
.
Además de eso, en C ++ 14 también puedes usar decltype(auto)
(que refleja decltype(auto)
como el de las variables) para que tu función pueda deducir su valor de retorno usando la semántica de decltype
.
Un ejemplo sería el de las funciones de reenvío, para las cuales decltype(auto)
es particularmente útil:
template<typename function_type, typename... arg_types>
decltype(auto) do_nothing_but_forward(function_type func, arg_types&&... args) {
return func(std::forward<arg_types>(args)...);
}
Con el uso de decltype(auto)
, imita el tipo de retorno real de func
cuando se le llama con los argumentos especificados. No hay más duplicación de código en el tipo de retorno final que es muy frustrante y propenso a errores en C ++ 11.