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