Clang 19.1.0 отклоняет вложенные лямбды с шаблонамиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Clang 19.1.0 отклоняет вложенные лямбды с шаблонами

Сообщение Anonymous »

Следующий код генерирует ошибку в clang 19.1.0, но передает более старые версии, gcc и msvc (живой пример).

Код: Выделить всё

template 
void func() {
(void)[]() consteval {
return []() {
return 0;
}.operator()();
}.template operator()();
}

template void func();

Код: Выделить всё

:4:16: error: cannot initialize object parameter of type 'const (lambda at :4:16)' with an expression of type '(lambda at :4:16)'
4 |         return []() {
|                ^~~~~~
5 |             return 0;
|             ~~~~~~~~~
6 |         }.operator()();
|         ~
:7:16: note: in instantiation of function template specialization 'func()::(anonymous class)::operator()' requested here
7 |     }.template operator()();
|                ^
:10:15: note: in instantiation of function template specialization 'func' requested here
10 | template void func();
|               ^
1 error generated.
Compiler returned: 1
Внесение некоторых, казалось бы, несвязанных и небольших изменений приводит к компиляции фрагмента.
Некоторые изменения, каждое из которых приведет к компиляции:
  • Превращение func в функцию без шаблона
  • Удаление шаблона (и изменение оператора .template() просто .operator()) из внешнего лямбда
  • Изменение внутренних лямбда-выражений .operator()() на просто ()
  • Удаление константы
  • Сохранение результата вызова внутренней лямбды в переменной и возврат этой переменной
  • Сохранение внутренней лямбды в переменной и возврат результата вызова этой лямбды .operator()
Несмотря на то, что отклоненный код является загадочным и, вероятно, его нельзя увидеть в каком-либо рабочем коде, я не не вижу в нем ошибок. Тот факт, что другие компиляторы это допускают (и даже более старые версии clang), дает мне уверенность, что это всего лишь ошибка компилятора. Есть ли объяснение такому поведению или это просто ошибка, как я подозреваю?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -templates
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»