web-dev-qa-db-fra.com

Utilisation de 'auto func (int)' avant déduction de 'auto' en C ++ 14

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?

24
msc

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.

34
Griwes

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.

27
Bartek Banachewicz

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.

5
songyuanyao