为什么 lambda 对象中的局部变量是常量变量?
Why local variables in the lambda object are const?
以下代码无法编译。因为pt
有const std::packaged_task<void()>>
的类型,operator()
不是const
。
auto packagedTask = std::packaged_task<void()>>([]{});
auto future = packagedTask.get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });
以下是解决方法:
auto packagedTask = std::make_shared<std::packaged_task<void()>>([]{});
auto future = packagedTask->get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });
为什么 lambda 对象中的局部变量const
? 我想让第一段代码在没有变通办法开销的情况下工作。解决问题的最佳实践是什么?
除非 lambda 被标记为mutable
,否则生成的lambda::operator()
将被限定为const
。将您的 lambda 标记为mutable
将防止此行为:
auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); });
为什么 lambda 对象中的局部变量
const
?
由lambda 表达式生成的闭包中的局部变量不const
。生成的lambda::operator()
符合const
.一个更好的问题可能是"为什么 lambda 的operator()
隐式const
?
这是因为const
是比mutable
更好的默认值。可变性带来了复杂性。不可变性使代码更容易推理。
const
应该是语言范围的默认值,但由于逆向兼容性,这是不可能的。由于 lambda 是一个全新的功能,委员会决定采用默认const
选择加入可变性。
相关文章:
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 非常量变量只读位置的赋值
- 使用大量已知常量变量的正确方法
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 这些语句是否等效(静态变量、常量变量和泛型)
- 包含常量变量并包含在多个文件中的标头的链接错误
- 我们如何修改常量变量的值
- 如何在模板类中设置静态常量变量
- 为什么常量变量是模板特殊化所必需的,而不是常量
- 如何在函数中传递常量变量?
- 定义常量变量的最佳方法
- C++ 声明常量变量,但推迟其初始化?
- 如何初始化具有常量变量的结构数组
- 使用常量变量作为维度将矩阵声明为类成员时出现编译器错误
- 使用指针 c++ 更改常量变量
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 为什么 lambda 对象中的局部变量是常量变量?
- 使用常量变量作为数组的大小
- 为许多类可能需要的所有常量变量制作独立的头文件是否是一种很好的做法?