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 decltypecosa 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é ay bestá en el decltypeargumento. Esto se debe a que solo los declara la lista de argumentos.
Puede solucionar el problema fácilmente utilizando declvallos 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 returndeclaraciones 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.