Подтвердить что ты не робот

Переменная "auto", используемая в лямбда в собственном инициализаторе

Сегодня я нашел этот код

#include <cstdio>

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

Удивительно, GCC принимает его. Clang отклоняет его, потому что он использует terminal в своем собственном intializer и объявляется auto.

Я ожидал ошибку, которую дал clang, но действительно ли она плохо сформирована? Или код должен быть принят?

4b9b3361

Ответ 1

Я думаю, что это работает в §7.1.6.4 [dcl.spec.auto]/p11:

Если требуется тип объекта с неподтвержденным типом-заполнителем для определения типа выражения программа плохо сформирована.

Вам нужен тип terminal, чтобы определить тип id-выражения terminal в return terminal(func(term)); (отредактировано, tip tip @Richard Smith), но в точке этого выражения вы не можете вывести тип terminal пока.