AUTOSAR C++14 Rule A5-1-4

Объект лямбда-выражения не должен переживать ни один из своих полученных ссылкой объектов.

Описание

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

Объект лямбда-выражения не должен переживать ни один из своих полученных ссылкой объектов.

Объяснение

Правило отмечает случаи, где лямбда-выражение получает объект ссылкой, и можно потенциально получить доступ к полученному объекту вне его осциллографа. Эта ситуация происходит, если объект лямбда-выражения переживает объект, полученный ссылкой.

Например, рассмотрите этот функциональный createFunction:

std::function<std::int32_t()> createFunction() {
   std::int32_t localVar = 0;
   return ([&localVar]() -> std::int32_t {
       localVar = 1;
       return localVar;
   });
}

createFunction возвращается лямбда-выражение возражают, что получает локальную переменную localVar ссылкой. Осциллограф localVar ограничивается createFunction но возвращенный объект лямбда-выражения имеет намного больший осциллограф.

Эта ситуация может привести к попытке получить доступ к локальному объекту localVar вне его осциллографа. Например, когда вы вызываете createFunction и присвойте возвращенный объект лямбда-выражения другому объекту aFunction:

auto aFunction = createFunction();
и затем вызовите новый объект aFunction:
std::int32_t someValue = aFunction();
полученная переменная localVar больше не находится в осциллографе. Поэтому значение, возвращенное от aFunction isundefined.

Если функция возвращает лямбда-выражение, чтобы не получать доступ к полученному объекту вне его осциллографа, убедитесь, что лямбда-выражение получает все объекты копией. Например, можно переписать createFunction как:

std::function<std::int32_t()> createFunction() {
   std::int32_t localVar = 0;
   return ([localVar]() mutable -> std::int32_t {
       localVar = 1;
       return localVar;
   });
}

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

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

Группа: Выражения

Введенный в R2019b