son pick personas persona para nuevo monto las iva fisicas fisica estacionamientos deducir deducibles deducible deduccion credito compra como camionetas automoviles acreditable c++ function gcc c++14 auto

pick - Uso de ''auto func(int)'' antes de la deducción de ''auto'' en C++ 14



las camionetas pick up son deducibles al 100 (3)

Clang tiene un mensaje de error mucho mejor para eso:

main.cpp:8:16: error: function ''func'' with deduced return type cannot be used before it is defined auto ret = func(5); ^

Supongo que eso se explica por sí mismo.

He compilado el siguiente programa en GCC usando C++14 .

#include <iostream> using namespace std; auto func(int i); int main() { auto ret = func(5); return 0; } auto func(int i) { if (i == 1) return i; else return func(i-1) + i; }

Pero, me sale el siguiente error.

In function ''int main()'': 8:16: error: use of ''auto func(int)'' before deduction of ''auto'' auto ret = func(5);

Entonces, ¿qué me estoy perdiendo aquí?


Cuando se utiliza auto como tipo de retorno en una declaración de función que no usa la sintaxis de tipo de retorno final, la palabra clave auto indica que el tipo de retorno se deducirá del operando de su declaración de retorno. Eso significa que la deducción no se puede realizar hasta la definición de la función func() , pero antes de que se haya utilizado en main() .

Puede mover la definición antes de main() , o usar la sintaxis del tipo de retorno final para especificar el tipo de retorno en la declaración.


Esto es [dcl.spec.auto/10] :

Si el tipo de una entidad con un tipo de marcador de posición no definido es necesario para determinar el tipo de una expresión, el programa está mal formado. Sin embargo, una vez que se ha visto una declaración de devolución no descartada en una función, el tipo de devolución deducido de esa declaración se puede utilizar en el resto de la función, incluso en otras declaraciones de devolución. [Ejemplo:

auto n = n; // error, n''s type is unknown auto f(); void g() { &f; } // error, f''s return type is unknown auto sum(int i) { if (i == 1) return i; // sum''s return type is int else return sum(i-1)+i; // OK, sum''s return type has been deduced }

- ejemplo final]

Para traducir esto al inglés: el compilador debe conocer el tipo de retorno antes de poder usar la función. En el caso de un auto usado como este, esto se logra típicamente moviendo la definición antes del punto de uso. Si realmente no necesita usar la deducción por tipo de devolución, puede mantener la definición después del uso si proporciona una firma, incluido el tipo de devolución, en la declaración.