Me encontré con este código:

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

Pensé que con todos los detalles, que eran nuevas para mí, pero uno.
Dígame, por favor, donde puedo leer sobre, lo que hace el operador flecha (->) significa, en función de la rúbrica?
Supongo puramente lógica, que -> operador determina un tipo, que será recibido por auto, pero quiero llegar a esta recta, pero no puede encontrar la información.

  • Es parte de la final el tipo de devolución de sintaxis. Consulte stackoverflow.com/a/4113390/962089
  • No es un operador, sino una parte de la sintaxis.
  • En respuesta a «¿dónde puedo leer?», el C++ Spec es la más autorizada. Carecen de fondos o el deseo de gastar $$, el último borrador de trabajo es a menudo lo suficientemente cerca y sin costo. Estas especificaciones son muy tecno-hablar, falta de familiaridad con la lectura de las especificaciones de la ISO, trate de cplusplus.com o cppreference.com o de otros sitios que no son válidas, pero son generalmente muy precisos. Nota: al final el tipo de retorno puede ser omitido empezando con C++14.
InformationsquelleAutor user1234567 | 2014-03-19

2 Comentarios

  1. 176

    En C++11, existen dos sintaxis para la declaración de la función:

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

    y

        auto identificador ( argumento-declaraciones… ) -> return_type

    Son equivalentes. Ahora, cuando ellos son equivalentes, ¿por qué cada vez que desee utilizar el último? Bien, C++11 introducido este fresco decltype cosa que le permite describir el tipo de una expresión. Así que puede que desee para obtener 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 te dirá que no sabe lo que a y b están en la decltype argumento. Esto es debido a que sólo están declarados por la lista de argumentos.

    Usted puede fácilmente evitar el problema mediante el uso de declval y los parámetros de la 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 es muy detallado de ahora. Así que la alternativa de la sintaxis de declaración fue propuesto y aplicado, y ahora usted puede escribir

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

    y es menos detallado y las reglas de ámbito no tenía necesidad de un cambio.


    C++14 de actualización: C++14 también permite sólo

        auto identificador ( argumento-declaraciones… )

    mientras la función se define completamente antes de su uso y todos los return declaraciones de deducir del mismo tipo. El -> sintaxis sigue siendo útil para el desempeño de funciones públicas (declarada en la cabecera) si desea ocultar el cuerpo en el archivo de origen. Algo obviamente que no se puede hacer con las plantillas, pero hay algunos tipos concretos (generalmente se obtiene a través de la plantilla de metaprogramación) que son difíciles de escribir de otra manera.

    • muy bueno, limpio e informativo respuesta @Jan Hudec. Con el pulgar hacia arriba. Hay algo cambió en C++14 como puedo usar auto para return tipo en dicha función sin la necesidad de que el -> decltype(a + b) parte. Es redundante por ahora o tiene otros casos donde todavía se debe usar? o es un compilador específico extensión?
    • C++14 incluye N3638, que permite deducir el tipo de retorno declarado como auto, sin la -> notación, mientras la función se define completamente antes de su uso y todos los return declaraciones de deducir del mismo tipo. El -> la notación es útil si desea utilizar la deducción de la función pública, mientras que esconde el cuerpo en el archivo de origen.

Dejar respuesta

Please enter your comment!
Please enter your name here