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