Widziałem w wielu przykładach, które można wykorzystać pojedynczy znak, aby uchwycić wielu zmiennych jak następuje:Ile przechwytuje lambda w C++ 11?
Rect rect;
Point point;
auto someLambda = [&](const SomeType& var)
{
if (rect.Contains(point))
{
var.Something();
}
this->MemberFunction();
};
ten kończy się chwytając rect
i point
przez odniesienie i daje również dostęp do this
, ale jak dużo to właściwie robi? Czy przechwytuje tylko te zmienne, których potrzebuje, czy też przechwytuje dosłownie wszystko, co jest w obecnym zakresie?
widziałem w innych przykładów, które można również określić poszczególne zmienne uchwycić tak:
Rect rect;
Point point;
auto someLambda = [this, &rect, &point](const SomeType& var)
{
if (rect.Contains(point))
{
var.Something();
}
this->MemberFunction();
};
Czy istnieje Zaletą robi to w taki czy inny? Ktoś, z kim pracowałem, wspomniał kiedyś, że używanie wersji "przechwytuj wszystko" jest droższe, ale nie mogę znaleźć żadnej dokumentacji, która by to poparła. Po prostu chcę wiedzieć na pewno, więc nie robię kodu bardziej skomplikowanego, niż musi być, lub robię drogie rzeczy, których nie powinienem robić.
Krótka odpowiedź: przechwytuje każdą zmienną, która jest używana * odr * w ramach lambda –
Powinieneś tylko wymieniać poszczególnych członków, jeśli nie masz innej opcji z powodu konieczności użycia różnych metod przechwytywania dla niektórych z nich. Użycie '[&]' pozwala kompilatorowi określić, które zmienne są odr używane w oparciu o twój kod; mając na uwadze, że jeśli spróbujesz jawnie wymieniać wszystko, możesz wymienić niektóre niepotrzebne, generując nieefektywny kod. –
@ M.M Z drugiej strony, z punktu widzenia bezpieczeństwa, określając, które zmienne * zamierzasz użyć w lambda, jawnie przechwytując _only_ tamte, istnieje mniejsze ryzyko, że następny programista lub nawet użytkownik nieumyślnie manipuluje przechwyconymi danymi. –