Отсутствует диагностика компилятора, когда идентификатор в простом захвате отображается как идентификатор объявления параметра - программирование
Подтвердить что ты не робот

Отсутствует диагностика компилятора, когда идентификатор в простом захвате отображается как идентификатор объявления параметра

Раздел о лямбда-захвате ([expr.prim.lambda.capture]/5) гласит, что

Если идентификатор в простом захвате появляется как идентификатор объявления параметра предложения объявления лямбда-декларатора, то программа некорректна.

Рассмотрим следующий пример:

#include <iostream>

int main ()
{
    auto foo = 1234;
    auto bar = [foo](int foo) { std::cout << foo << '\n'; };
    bar(4321);     
}

Последняя версия GCC (8.2.0 - выпущена 26 июля 2018 г.) не имеет диагностики для этого. Также не последняя версия Clang (7.0.0 - выпущена 19 сентября 2018 года).

Должна ли быть диагностика (ошибка/предупреждение) от этих компиляторов (как упомянуто в ссылке) по направлениям:

// parameter and simple-capture have the same name

Godbolt Демо здесь

4b9b3361

Ответ 1

Эта формулировка была добавлена в С++ 17 для устранения дефекта CWG 2211. Его не было в С++ 14, и казалось бы, что Clang и GCC не догнали это изменение до версий, которые вы проверяете.

Стоит отметить, что магистраль GCC действительно диагностирует эту программу как плохо сформированную в С++ 17.