- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
lambda 中对关键字 mutable
的需求是造成极大困惑的根源。
考虑代码:
int x = 10;
function<void()> lambda = [=]() mutable {x++; cout << "Inside lambda: x = " << x << "\n";};
cout << "Before lambda: x = " << x << "\n";
lambda();
cout << "After lambda: x = " << x << "\n\n";
输出:
Before lambda: x = 10
Inside lambda: x = 11
After lambda: x = 10
正如我们所见,变量 x
在 lambda 之后保持不变,因此没有副作用。
但是,如果我们“忘记”了关键字 mutable,就会出现错误。
作为 C++ 中默认的按值传递参数,对我来说需要 mutable 关键字没有意义。
有人可以编写(即使是伪代码)编译器生成的类来代替 lambda 吗?
谢谢
最佳答案
如前所述here mutable
说明符允许 lambda 修改复制捕获的参数并调用它们的非常量成员函数。它不会影响通过引用捕获的变量。
Can someone write (even in pseudo code) the class generated by the compiler, in place of the lambda?
给出一般情况并不容易,但我们可以定义在您的特定情况下有效的内容。
生成的类可能如下所示:
struct Lambda {
void operator()() { x++; }
int x{10};
};
如果删除 mutable
说明符,则函数运算符定义为 const
:
struct Lambda {
void operator()() const { x++; }
int x{10};
};
为简单起见,我用给定值 (10) 初始化了 x
并将其公开,但显然它是通过使用从周围上下文捕获的变量进行复制初始化的,并且无法从函数外部访问运算符。
它的类型也是从用于初始化它的变量中推导出来的,就像你这样做一样:
auto lambda_x = x;
参见 here了解更多详情。
关于c++ - Lambda 按值捕获和 "mutable"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056454/
我正在研究 clojure 库,当时我注意到一个可变字段被注释为 ^:unsynchronized-mutable 。可变是可变的,但我不知道不同步部分意味着什么,所以我读了 docs ,其中包含:
对于 put和 get操作 OpenHashMap跑赢大盘HashMap约5次:https://gist.github.com/1423303 HashMap时是否有任何情况应该优先于 OpenHas
下面的代码打开一个 .txt 文件并计算词频。我正在看一本书,但我感到困惑: 我的问题在这里: filename := os.Args[1] frequencyForWord := map[strin
我正在尝试添加两个 BitSet对象在一起(改变其中之一)。这应该是位集的有效操作。但似乎唯一能做到这一点的操作是 ++= .查看源代码,这似乎并没有区别对待添加位集。 在 Scala 2.9.1 中
trait Output { fn write(&mut self, text: &str); } struct DummyOutput {} impl Output for DummyOut
我正在用函数改变字符串值(我知道这是非常不安全和危险的): public static void reverse(String s) { try { Field val = S
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: C++ 'mutable' keyword class student { mutable int r
在《Java并发实践》一书中,在谈到“锁定和可见性”时,作者说道: We can now give the other reason for the rule requiring all thread
我想知道如何在 C99 中基本上声明 (a const pointer to (a mutable pointer to (a const type)))。 假设我有这个调用站点: const uin
我在考c++,下面有一个奇怪的代码块,我看不懂。这里,i 是一个 int 而 code 是一个 char: [=,&i]()mutable { i++; code = 'b'; std::
编译: []{}; 这也是: []() mutable {}; 但是对于这段代码,编译器会向我抛出错误信息: [] mutable {}; ^~~~~~~ error: lambda requi
我编写了如下所示的映射,即我的 mutable.HashMap 实现。 class SampleMap() extends mutable.HashMap[String, (Any, BigInt)]
我理解事物的方式是“变量”一词指的是重新分配引用的能力。 “常量”意味着不能重新分配引用。本质上是 Java 中 final 与 not 的区别。 var something = new obj()
是否有一种优雅的方式来更新 Map 中已经存在的值? 这看起来太可怕了: val a = map.get ( something ) if ( a != null ) // case .. excus
我正在尝试从向量中删除元素(如果存在): use std::collections::HashMap; fn test(map: HashMap>, department: String, emplo
在尝试克隆可变集合时,我最初的方法是对 mutable.Cloneable 特征使用 clone() 方法。但是,这取决于创建引用副本的 java.Object.clone 实现,而不是深拷贝。通过测
在尝试克隆可变集合时,我最初的方法是对 mutable.Cloneable 特征使用 clone() 方法。但是,这取决于创建引用副本的 java.Object.clone 实现,而不是深拷贝。通过测
MultiMap 的 addBinding 似乎不保留绑定(bind)到同一键的值的插入顺序,因为它使用的底层机制是 HashSet。使用 MultiMap 保留插入顺序的惯用方法是什么? 最佳答案
当我尝试在可变 Map 中插入一个元素时,我希望这个元素插入到我的 Map 而不是返回 Map(如 PF,不可变对象(immutable对象) ecc ...)出于这个原因,我使用了可变集合,但在我的
我意识到结构是不可变的,改变结构是邪恶的,改变结构中值的正确方法是创建新实例。但是,我不清楚新实例与允许结构可变的内存和性能方面/问题。 假设我有结构, struct Vehicle { pu
我是一名优秀的程序员,十分优秀!