operador de flecha ( - > ) en el encabezado de la función


Encontré tal código:

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

Me imaginé con todos los detalles, que eran nuevos para mí, pero uno. Dime por favor, ¿dónde puedo leer sobre, qué significa el operador de flecha (->) en el encabezado de la función? Supongo que puramente lógicamente, ese operador -> determina un tipo, que será obtenido por auto, pero quiero obtener esto directamente, pero no puedo encontrar información.

Author: imreal, 2014-03-19

2 answers

En C++11, hay dos sintaxis para la declaración de funciones:

tipo de devolución identificador ( argumento-declaraciones... )

Y

auto identificador ( argumento-declaraciones... ) -> return_type

Son equivalentes. Ahora, cuando son equivalentes, ¿por qué alguna vez quieres usar este último? Bueno, C++11 introdujo esta cosa genial decltype que te permite describir el tipo de una expresión. Por lo que es posible que desee derivar el tipo de retorno de los tipos de argumento. Así que intenta:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

Y el compilador le dirá que no sabe lo que a y b están en el argumento decltype. Esto se debe a que solo son declarados por la lista de argumentos.

Podría solucionar fácilmente el problema utilizando declval y los parámetros de plantilla que ya están declarados. Como:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

Excepto que se está volviendo muy detallado ahora. Así que la alternativa la sintaxis de la declaración fue propuesta e implementada 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 y cuando la función esté completamente definida antes de su uso y todas las sentencias return deduzcan al mismo tipo. La sintaxis -> sigue siendo útil para las funciones públicas (declarado en el encabezado) si desea ocultar el cuerpo en el archivo de origen. Obviamente eso no se puede hacer con plantillas, pero hay algunos tipos concretos (generalmente derivados a través de metaprogramación de plantillas) que son difíciles de escribir de otra manera.

 117
Author: Jan Hudec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 20:00:52

En inglés simple dice que el tipo de retorno es el tipo inferido de la suma de a y b.

 13
Author: murrekatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 19:02:35