AUTOSAR C++14 Rule A5-1-7

Лямбда не должна быть операндом для объявления типа или типа

Описание

Определение правила

Лямбда не должна быть операндом для объявления типа или типа.

Объяснение

Согласно стандарту 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