J'ai compilé le programme suivant dans GCC en utilisant 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;
}
Mais, j'obtiens l'erreur suivante.
In function 'int main()': 8:16: error: use of 'auto func(int)' before deduction of 'auto' auto ret = func(5);
Alors, qu'est-ce que je manque ici?
C'est [dcl.spec.auto/11[) :
Si le type d'une entité avec un type d'espace réservé non réduit est nécessaire pour déterminer le type d'une expression, le programme est mal formé. Cependant, une fois qu'une instruction de retour non supprimée a été vue dans une fonction, le type de retour déduit de cette instruction peut être utilisé dans le reste de la fonction, y compris dans d'autres instructions de retour. [ Exemple:
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 }
- fin exemple]
Pour traduire cela en anglais: le compilateur doit connaître le type de retour avant de pouvoir utiliser la fonction. Dans le cas où auto
est utilisé comme ceci, ceci est généralement réalisé en déplaçant la définition avant le point d'utilisation. Si vous n'avez pas réellement besoin d'utiliser la déduction du type de retour, vous pouvez conserver la définition après l'utilisation si vous fournissez une signature, y compris le type de retour, dans la déclaration.
Clang a un bien meilleur message d'erreur pour celui-ci:
main.cpp:8:16: error: function 'func' with deduced return type cannot be used before it is defined
auto ret = func(5);
^
Je suppose que cela va de soi.
Lorsque auto
est utilisé comme type de retour dans une déclaration de fonction qui n'utilise pas la syntaxe de type de retour de fin, le mot clé auto
indique que le type de retour sera déduit de l'opérande de son instruction return . Cela signifie que la déduction ne peut pas être effectuée avant la définition de la fonction func()
, mais avant qu'elle ait été utilisée dans main()
.
Vous pouvez déplacer la définition avant main()
, ou utiliser la syntaxe de type de retour de fin pour spécifier le type de retour sur la déclaration.