34 votes

La déduction automatique du type de retour oblige-t-elle plusieurs fonctions à avoir le même type de retour ?

Considérez l'extrait ci-dessous :

struct A
{
  auto foo(), bar();
};

auto A::foo() { return 1; }
auto A::bar() { return 'a'; }

int main()
{

}

Il compile bien dans Clang++ 3.7.0.

Il échoue dans G++ 5.2.0 :

main.cpp: In member function 'auto A::bar()':
main.cpp:7:24: error: inconsistent deduction for 'auto': 'int' and then 'char'
auto A::bar() { return 'a'; }

La déduction automatique du type de retour oblige-t-elle plusieurs fonctions, déclarées dans une seule déclaration, à avoir le même type de retour ?

25voto

Bo Persson Points 42821

Oui.

auto ne signifie pas "n'importe quel type", mais un type spécifique que le compilateur est censé déduire.

Ceci n'est pas spécifique aux déclarations de fonctions, auto i = 1, f = 4.7; ne fonctionne pas non plus.

En outre, déclarer plusieurs fonctions dans une seule déclaration ne semble pas être une bonne idée de toute façon.

25voto

chris Points 28950

Sur la base de ce qui suit, GCC a le bon comportement dans ce cas, mais seulement par coïncidence (voir ci-dessous) :

§7.1.6.4 [dcl.spec.auto]/8

Si la liste des déclarants d'initialisation contient plus d'un déclarant d'initialisation, ils doivent tous former des déclarations de variables.

Pourquoi seulement par coïncidence ? Le message d'erreur est un indice. En changeant les fonctions pour déduire le même type de retour, GCC compile le code. S'il a raison de donner une erreur ici, bien qu'elle soit trompeuse, il ne le fait que lorsque le type déduit est incohérent. Il devrait toujours donner une erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X