AUTOSAR C++14 Rule A5-1-7

Lambda не должен быть операндом к decltype или идентификатору типа

Описание

Управляйте определением

Lambda не должен быть операндом к decltype или идентификатору типа.

Объяснение

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

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

  • Присвойте тип другой переменной. Например:

    decltype(var1) var2;
    создает переменную var2 с тем же типом как var1.

  • Сравните типы двух переменных. Например:

    (typeid(var1) == typeid(var2))
    сравнивает типы var1 и var2.

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

Реализация Polyspace

Средство проверки правила отмечает использование decltype и 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)) 
     {
     // ...
     }
 }

Проверяйте информацию

Группа: лексические соглашения
Категория: необходимый, автоматизированный
Введенный в R2019b