メインコンテンツ

AUTOSAR C++14 Rule A5-1-7

A lambda shall not be an operand to decltype or typeid

説明

ルール定義

ラムダを decltype または typeid のオペランドとしてはなりません。

根拠

C++ 規格によると、ラムダ式の型は、一意で名前のないクラス型です。型が一意であるため、別の変数または式が同じ型をもつことができません。ラムダ式における decltype または typeid の使用は、2 番目の変数または式にオペランド ラムダ式と同じ型を与えようとしていることを示します。

decltypetypeid は共に、そのオペランドのデータ型を返します。通常、これらの演算子は次の目的のために使用されます。

  • 別の変数に型を割り当てる。次に例を示します。

    decltype(var1) var2;
    変数 var1 と同じ型をもつ変数 var2 を作成します。

  • 2 つの変数の型を比較する。次に例を示します。

    (typeid(var1) == typeid(var2))
    var1var2 の型を比較します。

このような使用方法は、一意の型をもつラムダ式には適用できません。

Polyspace 実装

ルール チェッカーは、ラムダ式で decltype および typeid が使用されるとフラグを立てます。

トラブルシューティング

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

すべて展開する


#include <cstdint>
#include <typeinfo>
 
 void func()
 {
 auto lambdaFirst = []() -> std::int8_t { return 1; };
 auto lambdaSecond = []() -> std::int8_t { return 1; };

 if (typeid(lambdaFirst) == typeid(lambdaSecond))  
     {
     // ...
     }
 }

ラムダ式で typeid を使用すると、予期しない結果をもたらすことがあります。lambdaFirstlambdaSecond は同じ本体をもつように見えますが、上記の比較は false となります。

修正 – typeid を使用する前にラムダ式を関数オブジェクトに割り当てる

1 つの修正方法として、ラムダ式を関数オブジェクトに割り当ててから、その関数オブジェクトで typeid 演算子を使用して比較を実行します。


#include <cstdint>
#include <functional>
#include <typeinfo>

 void func()
 {
 std::function<std::int8_t()> functionFirst = []() { return 1; };
 std::function<std::int8_t()> functionSecond = []() { return 1; };

 if (typeid(functionFirst) == typeid(functionSecond)) 
     {
     // ...
     }
 }

チェック情報

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

バージョン履歴

R2019b で導入

すべて展開する