Объект лямбда-выражения не должен пережить ни один из захваченных ссылками объектов
Объект лямбда-выражения не должен пережить ни один из захваченных ссылками объектов.
Правило помечает случаи, когда лямбда-выражение захватывает объект по ссылке, и вы потенциально можете получить доступ к захваченному объекту вне его возможностей. Эта ситуация происходит, если объект лямбда-выражения выбывает объект, захваченный ссылкой.
Например, рассмотрим эту функцию 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;
});
}Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Выражения |
| Категория: Необходимый, Автоматизированный |