メインコンテンツ

typeid オペランドとしてラムダが使用されています

ラムダ式で typeid が使用されている

説明

この欠陥は、ラムダ式で typeid を使用した場合に発生します。

リスク

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

typeid は、そのオペランドのデータ型を返します。通常、この演算子は 2 つの変数の型を比較するために使用されます。次に例を示します。

(typeid(var1) == typeid(var2))
var1var2 の型を比較します。この使用法は、一意の型を持つラムダ式には適していません。

修正方法

ラムダ式での typeid 演算子の使用を避けます。

すべて展開する

#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)) 
     {
     // ...
     }
 }

結果情報

グループ: オブジェクト指向
言語: C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: LAMBDA_TYPE_MISUSE
影響度: Low

バージョン履歴

R2019b で導入