Załóżmy, że mam następujące.Wyraz Lambda podstępnie przechwytujący "ten"
struct A
{
int x;
std::function<int()> f1() { return [=](){ return x; }; }
std::function<int()> f2() { return [=](){ return this->x; }; }
std::function<int()> f3() { return [this](){ return x; }; }
std::function<int()> f4() { return [this](){ return this->x; }; }
std::function<int()> f5()
{
int temp = x;
return [=](){ return temp; };
}
}
A teraz mam następujący kod.
auto a = std::make_shared<A>();
a->x = 5;
std::function<int()> f = a.f#();
a.reset();
int x = f();
gdzie f#
odnosi się do każdego z f1, f2, f3, f4, f5
.
Funkcje te wykazujących działanie w jednym z dwóch zestawów:
- powrotu 5, gdy jako (
f5
) lub - awarii próby dereference
nullptr
(f1, f2, f3, f4
).
Rozumiem, że to dlatego, że niektóre z nich są przechwytywanie „this
” w funkcji członkowskim A
, bezpośrednio lub pośrednio.
Jaka jest formalna reguła określająca zachowanie 1 lub 2?
Spędziłem natomiast do czynienia z błędem, który został spowodowany przez coś podobnego do f1
, myśląc, że to uchwycić x
i nigdy nie biorąc pod uwagę, że to uchwycić this
, więc pomyślałem, że wskazane byłoby, aby to udokumentować.
Oh - Nazwałam grupy 'f1, f2, f3, f4' i' f5' wstecz! Tak, chodzi mi o to, że to "f5" działa poprawnie, a pozostałe nie. Edytowane. –