Encontré el siguiente código:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Hay una cosa que no puedo entender:
¿Dónde podría averiguar qué significa el operador de flecha ( ->
) en el encabezado de la función? Supongo, lógicamente, que el ->
operador determina un tipo, que auto
se deducirá, pero quiero aclararlo. No puedo encontrar ninguna información.
Respuestas:
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_typeSon 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:y el compilador le dirá que no sabe qué
a
yb
está en eldecltype
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:excepto que ahora se está volviendo muy detallado. Entonces se propuso e implementó la sintaxis de declaración alternativa y ahora puede escribir
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.fuente
C++14
cuando usoauto
parareturn
escribir en dicha función sin la necesidad de la-> decltype(a + b)
parte? ¿Es redundante en este momento o tiene otros casos en los que todavía debería usarse? o es una extensión específica del compilador?auto
, sin la->
notación, siempre que la función esté completamente definida antes de su uso y todas lasreturn
declaraciones se deduzcan al mismo tipo. La->
notación sigue siendo útil si desea utilizar la deducción para la función pública mientras oculta el cuerpo en el archivo fuente.En inglés simple dice que el tipo de retorno es el tipo inferido de la suma de
a
yb
.fuente