C++ 所有lambda声明都应该是常量静态的吗?
Lambda对象声明(C++ 所有lambda声明都应该是常量静态的吗?,c++,C++,Lambda对象声明(std::function()/自动Lambda=[]()…)始终是文本,对吗?那么,这是否意味着,为了清晰、编码礼仪甚至性能,我们应该始终像任何其他作用域文字常量一样声明它们const static Lambda对象声明(std::function()/auto Lambda=…)始终是文本,对吗 不,lambda不是文本。它们可以从封闭范围捕获状态,并且可以是非常量。考虑: int f(int a, int b) { auto lambda = [=](int x
std::function()
/自动Lambda=[]()…
)始终是文本,对吗?那么,这是否意味着,为了清晰、编码礼仪甚至性能,我们应该始终像任何其他作用域文字常量一样声明它们const static
Lambda对象声明(std::function()/auto Lambda=…)始终是文本,对吗
不,lambda不是文本。它们可以从封闭范围捕获状态,并且可以是非常量。考虑:
int f(int a, int b) {
auto lambda = [=](int x) { return a*x; };
return lambda(b);
}
如果在此处添加static
,则使用f
的所有代码都将共享变量lambda
,并且仅在第一次调用时初始化该变量,从第一次调用到f
捕获a
的值。通过不使用它static
对f
的每次调用都将使用它自己的第一个参数
虽然这个例子很做作,但我希望它有助于澄清这一点。他们的操作符是
const
——默认情况下是合格的。但是static
在捕获局部变量之类的东西时通常不能很好地工作。最后但并非最不重要的一点是,lambda对象与std::function
没有任何关系,如果您至少关心一点性能,那么如果不是必要,您就不会将lambda放入std::function
,无论如何。没有其他litreal可以捕获对象。@ChristianRau为什么在std::function中存储lambda不好?@ausairman,因为std::function
会带来一些开销(简单地说,它在引擎盖下使用虚拟函数和运行时多态性,更不用说错过的内联机会)。通常,您需要一个std::function
来存储lambda,即从函数返回lambda或将其用作成员变量时,但有时不需要(如作为局部变量)。当你不这样做的时候,autolambda=[…](…){…}
意味着比将其放入std::function
中的开销要少得多。在示例中添加const难道不是一件好事吗?对于这样一个小函数来说,这可能有些过分了,但是养成了在可能的情况下编写它的习惯似乎是正确的。您是缺少了一个=
,还是自动捕获了a
?我认为没有任何理由添加不必要的常量。默认情况下,生成的操作符()
标记为const
,因此额外的限定不会产生任何差异,也不会添加信息。lambda要修改自己的状态,需要将其标记为mutable
,这已经非常明确了。在这种情况下,我看不到const
增加任何值,这会很尴尬,就像人们做constintf()一样
(你可能是其中之一:)@ChristianRau:a
将被值隐式捕获。@DavidRodríguez dribeas,但我认为只有当“捕获全部”(=
)存在时才是如此。但我可能错了。