C++_lambda, 匿名函数, std::function

匿名函数本质, std::function

int ret = []( int _id) -> int{
   
        return _id;
    }( 0);   ' 匿名函数, 可以这么用 '

匿名函数 和 类成员函数 一样, 他俩的本质, 其实都是, 全局函数!!!

class ST{
   
	void func();
}

' ST a, b, c; '
' a/b/c.func(), 他们所使用的func函数, 其实是 (同一个函数), 地址是一样的 '
' 比如, func()里 有个static变量, 这个static变量, 只会构造1个; (说明, 是同一个函数) '

即, 类的成员函数 与 成员变量不同;
(成员变量), 是取决于 (类对象)的; 有多少个obj, 就有多少个 (成员变量)
(成员函数), 是取决于 (类定义); 即便没有obj, 这个函数 也是已经有内存地址了

void func(){
   
	int ret = []( int _id) -> int{
   
        return _id;
    }( 0);
}

这个 (匿名函数), 也是只有1个!!!
不管你调用func()函数多少次, 所调用的 (匿名函数), 都是同一个!!!
比如, 匿名函数里 有个static变量, 这个static变量, 只会构造1个; (说明, 是同一个函数)

比如, (类ST里的 成员函数func里的 匿名函数x)
不管, 是哪个ST对象; 不管, func调用了多少次; 不管, 匿名函数x 调用了多少次
都是 同一个 匿名函数 即, 这个匿名函数的地址 都是同一个;
而且, 匿名函数的地址, 和函数内static变量地址 在一块; 即, 匿名函数 可以看做是 static类型的


void func(){
   
	static T t;
	int(* ptr)(int) = []( int _id) -> int{
   
        return _id;
    };
}

由于 他是 (匿名的), 我们可以让 一个指针 去指向他; ptr( 123) 即可调用
reinterpret_cast< long long>( ptr) 这个值, 是该匿名函数的 地址; 他 和 t的地址, 是同一个区域; 可见端详
匿名函数地址 和 t地址, 都是4000000 (static区域); ptr是 (6000000) 栈地址; new是在 (f00...)地址

如果写成: static int (* ptr)( int) = ..., 他的意思是: 让ptr这个指针, 变成: static类型!!! (原来他是 临时变量 (栈地址), 现在 他是 static变量 (static4000地址))

你把 int( * ptr)(int) 写成: function< int(int)> ptr, 本质是完全一样的!!! function只是做了一些封装
function< int(int)> ptr, ptr在 (栈地址), static function< int(int)> ptr, ptr在 (static地址)

你添加static修饰符, 是对 ptr而言的!!! 与 (匿名函数)无关!!! (匿名函数, 本身就是static的)

函数内static变量 , 全局变量

int b = 44
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值