variable "auto" utilizada en lambda en su propio inicializador


Hoy encontré este código

#include <cstdio>

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

Sorprendentemente, GCC lo acepta . Clang lo rechaza porque usa terminal en su propio intializador y es declarado auto.

Estaba esperando el error que clang dio, pero ¿es en realidad mal formado? ¿O debe aceptarse el código?

Author: Johannes Schaub - litb, 2014-09-06

1 answers

Yo creo esto se encuentra en §7.1.6.4 [dcl.spec.auto]/p11:

Si se necesita el tipo de una entidad con un tipo de marcador de posición sineducar para determinar el tipo de expresión, el programa está mal formado.

Necesita el tipo de terminal para determinar el tipo de la expresión id terminal en return terminal(func(term)); (editado, hat tip @Richard Smith), pero en el punto de esa expresión no se puede deducir el tipo de terminal todavía.

 15
Author: T.C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-05 21:53:30