2012-09-14 15 views
30

En un fichero de cabecera, veo la expresión de esta manera:¿Qué es "->" después de la declaración de la función?

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type> 
{...} 

no sé qué "->" significa, que no está puntero expresión o expresión lambda, alguien me puede ayudar?

+4

Por cierto, para buscar en Google, el término es "Tipo de retorno de seguimiento". – chris

Respuesta

47

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.

+0

Tiene acceso a los tipos de argumentos incluso con un tipo de devolución regular, ya que los parámetros de la plantilla siempre se declaran primero. A lo que no tienes acceso es a los nombres de los parámetros, o incluso al nombre de la función. –

Cuestiones relacionadas