Объект лямбда-выражения не должен переживать ни один из своих объектов, захваченных ссылкой
Объект лямбда-выражения не должен переживать ни один из своих объектов, захваченных ссылкой.
Правило помечает случаи, когда лямбда-выражение захватывает объект по ссылке и потенциально можно получить доступ к захваченному объекту вне его области действия. Такая ситуация возникает, если объект лямбда-выражения переживает объект, захваченный ссылкой.
Например, рассмотрим эту функцию 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 не определен.Если функция возвращает лямбда-выражение, чтобы избежать доступа к захваченному объекту вне его области действия, убедитесь, что лямбда-выражение захватывает все объекты копией. Например, можно переписать createFunction как:
std::function<std::int32_t()> createFunction() {
std::int32_t localVar = 0;
return ([localVar]() mutable -> std::int32_t {
localVar = 1;
return localVar;
});
}Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Выражения |
| Категория: Обязательно, Автоматизировано |