exponenta event banner

Правило AUTOSAR C++ 14 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