Правильность лямбда-выражения с пропущенным списком параметров в 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 { };
Но не тот, что в ОП.
Кроме того, не пишите этого.