メインコンテンツ

AUTOSAR C++14 Rule A5-1-8

Lambda expressions should not be defined inside another lambda expression

説明

ルール定義

Lambda expressions should not be defined inside another lambda expression.

根拠

開発者は、ラムダ式を使用して、数行のコードを含む無名関数オブジェクトを記述することができます。ラムダ式を入れ子にすると、コードの可読性が低下します。これは、通常、ラムダ式の本文は、それが使用される行内に存在するためです。たとえば、find_if アルゴリズムは、その引数の 1 つとして単項述語を取ります。開発者は、ラムダ式を使用して、find_if の宣言内で述語条件を定義することができます。このコード スニペットでは、find_if アルゴリズムが、2 より大きい偶数の整数のベクトルの最初のメンバーを返します。

std::vector<int> v = { 1, 2, 3, 4 };
std::find(v.begin(), v.end(),
    [](int val) { return val>2 && val%2==0;});

Polyspace 実装

Polyspace® は、別のラムダ式の内部で定義されたラムダ式にフラグを設定します。また、Polyspace は、最も近い入れ子のラムダ式を強調表示します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include<iostream>
#include<vector>
#include<algorithm>

int main()
{

    using namespace std;

    vector<int> v {1, 2, 3, 4};


    vector<int>::iterator it = v.begin();
    while (it != v.end()) {
        auto evenGreater2 = [](int val) {

            return [](int val2) { //Noncompliant
                return val2 % 2 == 0;
            }(val)&& (val) > 2;

        }(*it);


        if (evenGreater2) {
            cout << *it << endl;
            break;
        }
        ++it;
    }

}

この例では、Polyspace が、値が偶数かどうかをチェックするラムダ式 ([](int val2) { return val2 % 2 ==0; }) にフラグを設定します。これは、そのラムダ式が、値が 2 より大きいかどうかもチェックする別のラムダ式の内部に入れ子になっているためです。

チェック情報

グループ:
カテゴリ: Advisory、Automated

バージョン履歴

R2020b で導入