Переменная "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 еще.

Другие вопросы по тегам