メインコンテンツ

AUTOSAR C++14 Rule A5-1-6

Return type of a non-void return type lambda expression should be explicitly specified

説明

ルール定義

Return type of a non-void return type lambda expression should be explicitly specified.

根拠

コンパイラは、return 式の型に基づいて、ラムダ式の戻り値の型を推定できます。たとえば、ラムダ式から何も返されない場合、コンパイラは戻りの値の型が void であると推定します。

ラムダ式を宣言するときに戻り値の型を指定するかどうかは、オプションです。戻り値の型が非 void のラムダ式の場合、戻り値の型を明示的に指定しなければ、コードを読む開発者がラムダ式から返される値の型について混乱する可能性があります。

コンパイラが、返された式の型を想定どおりの戻り値の型に暗黙的に変換する際に、明示的な戻り値の型により型チェックが補強されます。

Polyspace 実装

Polyspace® は、戻り値の型が明示的に指定されていない場合、戻り値の型が非 void となっているラムダ式にフラグを設定します。

トラブルシューティング

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

すべて展開する

#include<iostream>
#include <cstdint>
#include <cstdio>

void  func()
{
    std::uint8_t TARGET = 10;
    auto lambda_incr = [&](std::uint8_t x) -> std::uint8_t {//Compliant
        while (x < TARGET)
            x++;
        return x;

    };
    auto lambda_decr = [&](std::uint8_t y) { //Non-compliant, returned type is not specified
        while (y > TARGET)
            y--;
        return y;

    };
    char exp[] = "hello.";
    auto lambda3 = [exp]() { //Compliant, void return type.
        std::cout << exp << std::endl;
    };

    auto x = lambda_incr(5);
    auto y = lambda_decr(11);
    lambda3();


}

この例では、ラムダ式 lambda_decr で戻り値の型が設定されていないため、Polyspace はこのラムダ式にフラグを設定します。lambda3 には戻り値の型が指定されていませんが、この式からは何も返されないため (void 型の戻り値)、Polyspace はこの式にはフラグを設定しません。

チェック情報

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

バージョン履歴

R2020b で導入