Интересно, как люди используют лямбды C ++ 0x, с точки зрения стиля кодирования. Самый интересный вопрос заключается в том, насколько тщательным должно быть составление списка захвата. С одной стороны, язык позволяет явным образом перечислять захваченные переменные, и поэтому «явное лучше, чем неявное правило», поэтому имеет смысл составить исчерпывающий список, чтобы четко указать намерение. E.g.:
int sum;
std::for_each(xs.begin(), xs.end(), [&sum](int x) { sum += x });
Другим аргументом для этого является то, что, поскольку время жизни перехваченных локальных объектов не меняется только потому, что они захвачены (и поэтому лямбда может легко в конечном итоге ссылаться на локальный объект, время жизни которого давно закончилось), что делает явный захват помогает уменьшить количество таких ошибок и отследить их.
С другой стороны, язык также преднамеренно обеспечивает ярлык для автоматического захвата всех указанных местных жителей, поэтому он явно предназначен для использования. И можно утверждать, что для примера, такого как приведенный выше, очень ясно, что происходит даже с автоматическим захватом, и время жизни лямбды таково, что оно не переживет окружающую область видимости, поэтому нет причин не использовать ее:
int sum;
std::for_each(xs.begin(), xs.end(), [&](int x) { sum += x });
Очевидно, что это не должно быть "все или ничего", но должно быть какое-то обоснование, чтобы решить, когда делать автоматический захват, а когда делать захват явно. Есть мысли?
Другой вопрос в том же духе заключается в том, когда использовать захват при копировании - [=]
, а когда использовать захват по ссылке - [&]
. Захват за копией, очевидно, более безопасен, потому что нет проблем с продолжительностью жизни, поэтому можно утверждать, что его следует использовать по умолчанию всякий раз, когда нет необходимости изменять захваченное значение (или видеть изменения, внесенные в него из других источников), а также захватывать Ссылка должна рассматриваться как (потенциально преждевременная) оптимизация в таких случаях, которая должна применяться только там, где она явно имеет значение.
С другой стороны, захват по ссылке почти всегда быстрее (особенно потому, что его часто можно оптимизировать вплоть до копии, если последняя на самом деле быстрее, для небольших типов и встроенных шаблонных функций, таких как большинство алгоритмов STL) и безопасен, если лямбда никогда не выходит за пределы своей области действия (что также имеет место для всех алгоритмов STL), поэтому по умолчанию в этом случае выборка по ссылке является тривиальной и безвредной оптимизацией, которая не повредит.
Что ты думаешь?