Правильность лямбда-выражения с пропущенным списком параметров в C++23

Согласно cppreference , и gcc, и clang недавно завершили реализацию P1102R2 («Сделать () более необязательным для лямбда-выражений »), что означает, что мы можем более точно определять лямбда-выражения в C++23.

Но я обнаружил, что они несовместимы с определенной формой:

      auto l = []<auto> noexcept requires true {};

clang принимает эту форму, а gcc отклоняет ее грамматику.

Какому компилятору мне следует доверять? Является ли эта лямбда правильной или неправильной в C++23?

1 ответ

Решение

Спасибо, что напомнили мне о бессмысленности этой функции.

Правильный ответ: нет, это неправильная лямбда. Грамматика определена в [expr.prim.lambda.general]:

В нашем случае для начала у нас есть:

      []<auto> noexcept requires true {};
  • []является лямбда-интродуктором
  • <auto> Спички <template-parameter-list>и теперь мы знаем, что мы - лямбда-выражение второго типа . Итак, грамматически нам нужно следовать с предложением requires-clause (необязательно), затем лямбда-декларатором, а затем составным оператором .
  • не соответствует required-clause , поэтому теперь мы разбираем лямбда-декларатор . Лямбда-описатель может начинаться с (parameter-declaration-clause)но у нас этого нет, поэтому мы просто ищем лямбда-спецификаторы . Мы потребляем noexceptкак часть спецификатора noexcept .
  • requires trueне подходит ни для атрибута-спецификатора-seq, ни для конечного-возвращаемого-типа, поэтому у нас нет ни одного из них, и теперь мы закончили с лямбда-спецификаторами, поэтому мы закончили с лямбда-декларатором . На этом этапе мы ищем составной оператор . Но у нас этого нет, так что это ошибка.

По сути, есть два места, где вы можете разместить предложение required : либо сразу после параметров шаблона, либо, если у нас есть параметры функции , после лямбда-спецификаторов после параметров функции. Итак, это работает:

      []<auto> requires true noexcept {};

как это делает:

      []<auto>() noexcept requires true {};

как это делает:

      []<auto> requires true () noexcept requires true { };

Но не тот, что в ОП.

Кроме того, не пишите этого.

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