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

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

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

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

#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

Демонстрация Годболта здесь

1 Ответ

0 голосов
/ 23 октября 2018

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

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

...