En C ++ 11, hay dos sintaxis para la declaración de función:
declaraciones de argumento de identificador de tipo de retorno (
... )
y
auto
identificador (
argumento-declaraciones ... )
->
return_type
Son equivalentes Ahora, cuando son equivalentes, ¿por qué quieres usar este último? Bueno, C ++ 11 introdujo esta decltype
cosa genial que te permite describir el tipo de expresión. Por lo tanto, es posible que desee derivar el tipo de retorno de los tipos de argumento. Entonces intentas:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
y el compilador le dirá que no sabe qué a
y b
está en el decltype
argumento. Esto se debe a que solo los declara la lista de argumentos.
Puede solucionar el problema fácilmente utilizando declval
los parámetros de plantilla que ya están declarados. Me gusta:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
excepto que ahora se está volviendo muy detallado. Entonces se propuso e implementó la sintaxis de declaración alternativa y ahora puede escribir
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
y es menos detallado y las reglas de alcance no tuvieron que cambiar.
Actualización de C ++ 14: C ++ 14 también permite solo
auto
identificador (
argumento-declaraciones ... )
siempre que la función esté completamente definida antes de su uso y todas las return
declaraciones se deduzcan al mismo tipo. La ->
sintaxis sigue siendo útil para las funciones públicas (declaradas en el encabezado) si desea ocultar el cuerpo en el archivo fuente. Obviamente, eso no se puede hacer con las plantillas, pero hay algunos tipos concretos (generalmente derivados de la metaprogramación de plantillas) que son difíciles de escribir de otra manera.