【发布时间】:2013-05-26 22:10:28
【问题描述】:
为什么按值捕获的值是 const,而按引用捕获的对象不是:
int a;
auto compile_error = [=]()
{
a = 1;
}
auto compiles_ok = [&]()
{
a = 1;
}
对我来说这似乎不合逻辑,但它似乎是标准?尤其是对捕获的值进行不必要的修改可能是一个烦人的错误,但结果很可能仅限于 lambda 范围,而对通过引用捕获的对象进行不必要的修改通常会导致更严重的影响。
那么为什么不默认通过 const 引用捕获呢?或者至少支持 [const &] 和 [&]?这种设计的原因是什么?
作为解决方法,您可能应该使用 std::cref 包装的由值捕获的 const 引用?
【问题讨论】:
-
捕获引用的重点在于改变它。 没有理由改变一个值 - 这是没有意义的。
-
引用是不可变的,绑定后永远无法更改。所以从某种意义上说,lambda 表达式与这里的其他语言是一致的。您可能想了解
mutable对于 lambda 表达式的含义。 -
@Elazar:临时值可能会更改,但仍然如您所建议的那样,更改值没有问题,而更改引用的对象确实会影响其他可能意外的范围(错误)。
-
值不会改变。包含它们的变量可能。对(和来自)其他范围的影响正是这里想要的特性。一个容易被滥用,但仍然需要的。
标签: c++ c++11 lambda constants capture