Интересно, как люди используют С++ 0x lambdas с точки зрения стиля кодирования. Самый интересный вопрос - насколько тщательным является при записи списка захвата. С одной стороны, язык позволяет явно отображать захваченные переменные, а "явным лучше, чем неявное правило", поэтому имеет смысл сделать исчерпывающий список, чтобы четко указать интуицию. Например:.
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 });
Очевидно, что это не должно быть ничего или ничего, но должно быть какое-то обоснование, чтобы решить, когда делать автоматический захват, и когда делать захват явно. Любые мысли?
Другой вопрос в том же ключе - когда использовать capture-by-copy - [=]
, а когда использовать capture-by-reference - [&]
. Захват за копией, очевидно, более безопасен, потому что нет проблем с продолжительностью жизни, поэтому можно утверждать, что он должен использоваться по умолчанию, когда нет необходимости мутировать захваченное значение (или видеть изменения, сделанные с ним из других источников) по-ссылке следует рассматривать как (потенциально преждевременную) оптимизацию в таких случаях, применять только там, где это явно имеет значение.
С другой стороны, захват по ссылке почти всегда быстрее (тем более, что его часто можно оптимизировать до копии, если последнее на самом деле быстрее, для небольших типов и встроенных функций шаблона, таких как большинство алгоритмов STL), и является безопасным, если лямбда никогда не переживает его объем (что также имеет место для всех алгоритмов STL), поэтому по умолчанию для привязки к ссылке в этом случае является тривиальная и безопасная оптимизация, которая не повреждает.
Каковы ваши мысли?