AUTOSAR C++14 Rule A5-1-9

Идентичные безымянные выражения лямбды должны быть заменены на именованную функцию или именованное лямбда-выражение

Описание

Определение правила

Идентичные безымянные выражения лямбды должны быть заменены на именованную функцию или именованное лямбда-выражение.

Объяснение

Когда вы повторно используете безымянное лямбда выражение, вы вставляете тело этого лямбда выражения всякий раз, когда вы вызываете его в коде. Это дублирование кода может привести к проблемам поддерживаемости при внесении изменений, так как вы можете неправильно определить, какие лямбда-выражения идентичны при применении этих изменений. Дублирование кода также снижает читаемость вашего кода.

Реализация Polyspace

После первого использования неназванного лямбда-выражения, Polyspace® помечает каждое последующее использование идентичного лямбда-выражения. Например, если вы трижды повторно используете одно и то же лямбда-выражение, Polyspace помечает второе и третье использование лямбда-выражения как отдельные нарушения. Polyspace также подсвечивает первое использование безымянного лямбда-выражения в вашем исходном коде.

Polyspace не помечает повторное использование лямбда-выражений глобальных возможностей видимости.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include<vector>
#include<algorithm>


void func1(std::vector<int>& v)
{
    if (none_of(v.begin(), v.end(),
    [](int i) {return i % 2 == 1;})) {
        //Handle error
    }

    int odds = std::count_if(v.begin(), v.end(),
    [](int i) {return i % 2 == 1;}); //Noncompliant

    std::vector<int>::iterator first_odd = find_if(v.begin(), v.end(),
    [](int i) {return i % 2 == 1;}); //Noncompliant
}

void func2(std::vector<int>& v)
{
    auto is_odd = [](int i) { return i % 2 == 1;};

    if (none_of(v.begin(), v.end(), is_odd)) {
        //Handle error
    }

    int odds = std::count_if(v.begin(), v.end(), is_odd); //Compliant,
                                                          //reusing named lambda expression 

    std::vector<int>::iterator first_odd = find_if(v.begin(),
            v.end(), is_odd); //Compliant, reusing named lambda expression
}

В этом примере безымянное лямбда-выражение [](int i) {return i % 2 == 1;} повторно используется дважды внутри func1. Polyspace помечает второе и третье использование этого лямбда выражения.

Повторное использование лямбда-выражения в func2 не помечен, потому что лямбда-выражение имеет имя (is_odd).

Проверяйте информацию

Группа: Выражения
Категория: Консультационные, Автоматизированные
Введенный в R2020b