Es la nueva sintaxis de declaración de funciones de C++ 11, y se llama "tipo de retorno final". Al final de una declaración de función, ->
significa que el siguiente es el tipo de retorno de la función. Solo se puede usar cuando se usa la palabra clave auto
en lugar de un tipo de devolución real donde normalmente lo esperaría.
Por ejemplo, estas dos declaraciones son compatibles:
int foo();
auto foo() -> int;
Dependiendo de sus gustos, puede que le resulte más bonita que la sintaxis de declaración de edad, sobre todo cuando el tipo de retorno es extremadamente larga/complejo:
task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param);
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;
Pero a veces puede ser necesario con plantillas, cuando el tipo de devolución de la función puede variar con los argumentos.
decir que quieres una función de plantilla para añadir variables:
template<typename T>
T add(const T& x, const T& y)
{
return x + y;
}
Eso está muy bien, pero sólo se podrá añadir variables del mismo tipo. Supongamos que le gustaría poder agregar variables de cualquier tipo (como add((int)1, (double)2)
).
template<typename T, typename U>
??? add(const T& x, const U& y)
{
return x + y;
}
El problema es que no se puede saber de antemano qué tipo de resultado de x + y
será. A medida que las plantillas se colocan, incluso podrían ser tipos no integrales. (¿No le gustaría poder hacer add(std::string("x"), "y")
?)
Decltype
, junto con la nueva sintaxis de declaración de funciones, le permite resolver este problema.
template<typename T, typename U>
auto add(const T& x, const U& y) -> decltype(x + y)
{
return x + y;
}
Decltype
"ganancias" del tipo de una expresión. Dado que necesita que x
y y
hayan sido declarados para que decltype(x + y)
funcionen, necesita la nueva sintaxis.
Por cierto, para buscar en Google, el término es "Tipo de retorno de seguimiento". – chris