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