c++小知识
一.const 与 mutable
const修饰的函数为常函数,常函数只能调用常函数,且函数内不能修改成员变量
如果想要在常函数中修改某个变量的话,就要在这个变量前面加mutable修饰符
这里可能会有疑问,如果想要在函数里修改变量,那把const修饰符去掉不就好了吗,我在知乎的一篇文章里看到有个评论,觉得很有道理
“c++的思想就是,你想要的都给你,至于你是否用,以及是否用的合理,那是你来评估的,作为语言不会限制,比如这个mutable 就是为了要在const函数里要改一部分需要改的变量,所以会加mutable,增加一个等级复杂度来让你确认,你真的要改这个变量吗?包括const cast 一样,就是传进来是const,但是因为你的业务发展,多个版本迭代,导致发现你需要对这个const 引用做修改,你就可以用const cast去把const 属性来取消。再说,话说只要是再数据段的变量,你只要想改,对于支持指针的语言俩说,谁都阻止不了你去改这段内存的内容的”
mutable修饰符就恰恰提现了c++语言的可操作性
在lambda中,如果捕获列表是[a]的形式,说明是以值的方式进行传递,默认是const的,不能对其进行修改,除非加mutable修饰符
auto err = [i](){ ++i; }; //Error: 试图修改按值捕获的变量i
auto err2 = [x{22}](){ ++x; }; //Error: 试图修改内部变量x
auto ok = [i, x{22}]() mutable { i++; x++; };
提示:未完待续……