std::function<int()> void f1()
{
int a, b, c, d, ..., x, y, z;
return [=] { return a + b + c; };
}
vs.Czy złym zwyczajem jest zawsze uchwycić wszystko w wyrażeniu lambda?
std::function<int()> void f2()
{
int a, b, c, d, ..., x, y, z;
return [a, b, c] { return a + b + c; };
}
trzeba dodawać, że ta pierwsza jest krótsza, bardziej poręczne i bardziej elegancki niż ten ostatni.
Ja jednak nadal martwić:
Z punktu widzenia wydajności, to ten ostatni zawsze lepiej niż poprzednio?
Czy standard gwarantuje, że wyrażenie lambda przechwyci tylko niezbędne zmienne? W pierwszym przykładzie przechwytywane są tylko a, b, c niewykorzystane zmienne d, ..., x, y, z nie są.
Przechwytują tylko to, co jest używane. Styl przebija wydajność przez długie ujęcie tutaj. – chris
@chris, czy możesz skierować mnie do standardu? – xmllmx
@xmllmx Nie mogę skierować cię do akapitu, ale rozważ klasę, która ma konstruktora kopii z efektami ubocznymi (zapis pliku, cout itd.). Jeśli lambda przechwyciła nieużywany, niepubliczny obiekt tego typu według wartości i dlatego wywołał konstruktora kopiowania, byłby on * całkiem zły *. Więc nawet nie widząc "prawa" w tej sprawie, powiedziałbym, że jest to całkiem pewne. – us2012