Требуется разъяснение о том, как захватывать по ссылке в рекурсивной лямбде C++.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Требуется разъяснение о том, как захватывать по ссылке в рекурсивной лямбде C++.

Сообщение Anonymous »

Во время написания ливины, которая будет распределена между программами, составленными в соответствии с GCC 14.2.0 для X86 и ARM 6.22 для Cortex-M, я наткнулся на несоответствие между тем, как эти два компилятора обрабатывают рекурсивный захват лямбды при использовании нового 'Это Auto &&' , выведенная «эта» функция.

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

/* Compiled with --std=c++23 option */

struct Foo
{
int s = 1 ;

void zook (void)
{
auto f_ok = [ & s = s ] (this auto && f , int x) -> void // ok
{
if (x < 10) f (x + s) ;
} ;

auto f_bad = [ & ] (this auto && f , int x) -> void // error: invalid use of non-static data member 'Foo::s'
{
if (x < 10) f (x + s) ;
} ;

f_ok  (1) ;
f_bad (1) ;
}
} ;
Лямбда 'f_ok' с явным захватом ссылок на переменную 's работает нормально.
Лямбда 'f_bad', использующая '&', должна захватывать переменную 's', но генерирует ошибку компилятора как показано в комментариях к коду при компиляции с использованием GCC.
Компилятор ARM принимает обе версии и генерирует один и тот же двоичный файл, но компилятор GCC жалуется на версию 'f_bad'.
Я трачу немного время углублялся в спецификации C++ и не смог определить, что говорит стандарт об этом конкретном случае.
На этом этапе я подозреваю, что в GCC есть ошибка компилятора.< /p>
По порядку чтобы быть уверенным, мне нужно знать, что стандарт C++23 определяет в отношении захвата лямбда-выражений в этих условиях.
Если кто-нибудь может пролить свет на это и/или, возможно, указать на соответствующую часть спецификации, буду признателен.

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

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

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

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

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

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