首页 > 编程知识 正文

mutable c 浅析,浅析创新驱动发展战略的必要性与时代意义

时间:2023-05-03 17:18:08 阅读:260586 作者:4249

mutable:易变的,意思和volatile相近,但是两个关键字的用法不同。volatile主要应用于多线程,这里不做详细讨论。

穷则变,变则通,mutable就是这样,先讨论下mutable在类中的应用:

在类中,mutable只能用于修饰类的数据成员。其作用在于说明在成员总是可以改变的,即使是在该类的const对象的const成员函数中。mutable和const不能同时使用。//来一个计数器的实例吧class Mutable {public:mutable int Count = 0;int increase()const {return Count++;}};int main() {std::cout << "object is writeable and readable." << std::endl;Mutable m;std::cout << m.increase() << std::endl;std::cout << m.increase() << std::endl;std::cout << m.increase() << std::endl;std::cout << "object is readonly." << std::endl;Mutable const const_m;std::cout << const_m.increase() << std::endl;std::cout << const_m.increase() << std::endl;std::cout << const_m.increase() << std::endl;std::cout << const_m.increase() << std::endl;return 0;}

 

然后,就是c++11的lambda表达式中的mutable的应用: 

先瞧一瞧lambda函数的通式: auto f = [函数对象参数](函数参数列表) mutable throw(类型)->返回值类型 {函数语句}; 当lambda函数按值捕捉时,默认的是函数时const的,所以捕捉的变量在函数内是不可改变的int main() {int a = 10, b = 100;auto f = [a, b]()->int {a++; return a + b; };return 0;}////1>------已启动生成: 项目: name, 配置 : Debug Win32------//1> main.cpp//1>e:datavsnamenamemain.cpp(58) : error C3491 : “a” : 无法在非可变 lambda 中修改通过复制捕获//== == == == == 生成 : 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 == == == == ==

然后加上mutable

int main() {int a = 10, b = 100;auto f = [a, b]()mutable->int {a++; return a + b; };std::cout << "mutable test<<" << f() << std::endl;return 0;}

=============

其实可以简单思考下原理:

首先,c++中非成员函数都是全局的,具有外链性,不可以定义局部函数,那么问题来了?

Functor,是的,lambda表达式其实就是仿函数实现的。

看一看吧,

auto f = [a, b]()mutable->int {a++; return a + b; };000B22DC lea eax,[b] 000B22DF push eax 000B22E0 lea ecx,[a] 000B22E3 push ecx 000B22E4 lea ecx,[f] 000B22E7 call <lambda_ccf1f507c2bda1959d8394975bda01ed>::<lambda_ccf1f507c2bda1959d8394975bda01ed> (0B1E30h) f();000B22EC lea ecx,[f] 000B22EF call <lambda_ccf1f507c2bda1959d8394975bda01ed>::operator() (0B2120h)

 其中的<lambda_ccf1f507c2bda1959d8394975bda01ed>::operator() (0B2120h) ,ok,验证完毕,所以说mutable在lambda函数的应用,其实并没有脱离她在类中的应用的出发点,只是在语法上做出了新规定。

 

//小子毕竟才疏学浅,希望路过的Big-Old多多指正.

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。