我想知道人们在编写 C++0x lambda 时使用的编码风格。最有趣的问题是在编写捕获列表时应该多么详尽。一方面,语言允许显式列出被捕获的变量,并且根据“明确胜于含蓄”的规则,因此进行详尽的列举以清楚地表明意图是很有意义的。例如:
int sum;
std::for_each(xs.begin(), xs.end(), [&sum](int x) { sum += x });
另一个支持显式引用的理由是,因为被引用局部变量的生命周期不会因为被引用而改变(因此,一个 lambda 函数很容易引用到其生命周期已经结束的局部变量),所以通过显式引用可以有助于减少此类错误并跟踪它们。另一方面,该语言还故意提供了一个捷径,用于自动捕获所有引用的局部变量,因此明显是打算用到它的。有人可能会认为,对于像上面那个例子这样的情况,即使使用自动捕获,情况也非常清楚,并且 lambda 函数的生命周期不会超出周围范围,因此没有理由不使用它。
int sum;
std::for_each(xs.begin(), xs.end(), [&](int x) { sum += x });
显然,这不必是全有或全无的,但必须有一些理由来决定何时自动捕获,何时显式进行捕获。有什么想法吗?同样在相同的问题上,还有何时使用复制方式捕获-
[=]和何时使用引用方式捕获- [&]
。复制方式捕获显然更安全,因为没有生命周期问题,因此可以认为每当没有需要改变捕获值(或从其他地方查看对其所做的更改)时,默认情况下应该使用它,并且可以将引用方式捕获视为(潜在的过早)优化,仅在确实有区别的情况下应用。
另一方面,几乎总是更快的捕获-by-reference(特别是因为它通常可以被优化成复制方式,如果后者实际上更快,则适用于小型类型和大多数可内联模板函数,如大多数STL算法),如果lambda永远不会超出其范围(这也是所有STL算法的情况),因此在这种情况下默认使用引用方式捕获是微不足道且无害的优化。
你怎么看?
g ++
版本(不是beta!)具有lambda表达式的生产质量实现 - 我错了吗? - Pavel Minaev