Переменная "auto", используемая в лямбда в собственном инициализаторе
Сегодня я нашел этот код
#include <cstdio>
auto terminal = [](auto term)
{
return [=] (auto func)
{
return terminal(func(term));
};
};
Удивительно, GCC принимает его. Clang отклоняет его, потому что он использует terminal
в своем собственном intializer и объявляется auto
.
Я ожидал ошибку, которую дал clang, но действительно ли она плохо сформирована? Или код должен быть принят?
Ответы
Ответ 1
Я думаю, что это работает в §7.1.6.4 [dcl.spec.auto]/p11:
Если требуется тип объекта с неподтвержденным типом-заполнителем для определения типа выражения программа плохо сформирована.
Вам нужен тип terminal
, чтобы определить тип id-выражения terminal
в return terminal(func(term));
(отредактировано, tip tip @Richard Smith), но в точке этого выражения вы не можете вывести тип terminal
пока.