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