exponenta event banner

Лямбда используется в качестве операнда typeid

typeid используется в лямбда-выражении

Описание

Этот дефект возникает при использовании typeid на лямбда-выражении.

Риск

Согласно стандарту C++, тип лямбда-выражения является уникальным, безымянным типом класса. Поскольку тип уникален, другая переменная или выражение не могут иметь тот же тип. Использование typeid лямбда-выражение указывает, что ожидается, что вторая переменная или выражение будет иметь тот же тип, что и лямбда-выражение операнда. Использование таким образом типа лямбда-выражения может привести к неожиданным результатам.

typeid возвращает тип данных операнда. Обычно оператор используется для сравнения типов двух переменных. Например:

(typeid(var1) == typeid(var2))
сравнивает типы var1 и var2. Это использование не применяется к лямбда-выражению, которое имеет уникальный тип.

Зафиксировать

Избегайте использования 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 лямбда-выражения могут привести к неожиданным результатам. Сравнение выше является ложным, даже если lambdaFirst и lambdaSecond похоже, имеет одно и то же тело.

Исправление - назначение лямбда-выражения объекту функции перед использованием typeid

Одной из возможных корректировок является назначение лямбда-выражения объекту функции, а затем использование 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
Воздействие: Низкий
Представлен в R2019b