C++ 所有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

Lambda对象声明(
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,但我认为只有当“捕获全部”(
=
)存在时才是如此。但我可能错了。