35 votes

Variable "auto" utilisée dans lambda dans son propre initialiseur

Aujourd'hui, j'ai trouvé ce code

 #include <cstdio>

auto terminal = [](auto term)           
{                                       
    return [=] (auto func)             
    {                                   
        return terminal(func(term));
    };
};
 

Étonnamment, GCC l'accepte . Clang le rejette car il utilise terminal dans son propre initialiseur et est déclaré auto .

Je m'attendais à l'erreur que clang a donnée, mais est-elle en fait mal formée? Ou le code doit-il être accepté?

15voto

T.C. Points 22510

Je pense que cela va dans le §7.1.6.4 [dcl.spec.auto]/p11:

Si le type d'une entité avec une undeduced espace réservé de type est nécessaire pour déterminer le type d'une expression, le programme est mal formé.

Vous avez besoin du type d' terminal pour déterminer le type de l' id de l'expression- terminal en return terminal(func(term)); (édité, hat tip @Richard Smith), mais au moment de l'expression, vous ne pouvez pas déduire le type d' terminal encore.

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