社区讨论

关于 lambda 神人语法

学术版参与者 9已保存回复 22

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
22 条
当前快照
1 份
快照标识符
@mhj2xuhq
此快照首次捕获于
2025/11/03 19:51
4 个月前
此快照最后确认于
2025/11/03 20:41
4 个月前
查看原帖
本人在写 lambda 的时候,用了引用捕获
CPP
namespace pollard {
	auto qpow = [] (int bs ,int p ,int mod) -> int {
		int ans = 1ll ;
		for (; p ; p >>= 1 ,bs = ((ll) bs) * ((ll) bs) % mod) 
			((p & 1) && (ans = ((ll) ans) * ((ll) bs) % mod)) ;
		return ans ;
	} ;

	auto mlrb = [&qpow] (int x) -> bool {
		if (x < 3 || x % 2 == 0) return x == 2 ;
		int t = __builtin_ctzll (x - 1) ,r = (x - 1) >> t ;
		f (i ,1 ,12 ,1) {
			if (pr[i] == x) return true ;
			int v = qpow (pr[i] ,r ,x) ;
			f (j ,1 ,t ,1) {
				int b = ((ll) v) * ((ll) v) % x ;
				if (b == 1 && (v != 1 && v != x - 1)) return false ;
				v = b ;
				if (v == 1 || (v == x - 1 && (j ^ t))) { v = 1 ; break ;}
			} if (v != 1) return false ;
		} return true ;
	} ;
	
	auto gcd = [] (int a ,int b) -> int {
		int atz = __builtin_ctzll (a) ,btz = __builtin_ctzll (b) ;
		int z = std :: min (atz ,btz) ;
		b >>= btz ;
		while (a) {
			a >>= atz ;
			int minu = std :: abs (a - b) ;
			((minu < 0) && (minu = -minu)) ;
			b = std :: min (a ,b) ;
			atz = __builtin_ctzll (a = minu) ;
		} return b << z ;
	} ;
	
	auto g = [] (int x ,int c ,int mod) -> int {
		ll v = ((ll) x) * ((ll) x) + ((ll) c) ;
		return v % mod ;
	} ; 
	
	auto rho = [&g ,&gcd] (int n) -> int {
		if (n == 4) return 2 ;
		static std :: mt19937 rng 
		(std :: chrono :: system_clock :: now ().time_since_epoch ().count ()) ;
		std :: uniform_int_distribution < int > rnd (3 ,n - 1) ;
		int x = rnd (rng) ,y = x ,c = rnd (rng) ;
		y = g (g (x ,c ,n) ,c ,n) ,x = g (x ,c ,n) ;
		for (int lim = 1 ; x ^ y ; lim = std :: min (lim << 1 ,128ll)) {
			int mul = 1ll ;
			f (i ,1 ,lim ,1) {
				int tmp = ((ll) mul) * ((ll) std :: abs (x - y)) % n ;
				if (! tmp) break ;
				mul = tmp ;
				x = g (x ,c ,n) ,y = g (g (y ,c ,n) ,c ,n) ;
			} 
			int d = gcd (mul ,n) ;
			if (d != 1) return d ;
		} return n ;
	} ;
	
	inline void dfs (int n) {
		if (n == 1) return ;
		if (mlrb (n))
			return ans = std :: max (ans ,n) ,void () ;
		int p = n ;
		for (; p == n ; p = rho (n)) ;
		dfs (p) ,dfs (n / p) ;
	}
}
这个是过编的,可以发现其中我的 mlrb,rho 表达式都显式捕获了其他表达式。
但是当我把捕获的具体名称删去,比如改为 auto mlrb = [&] () -> int,在 c++14 GCC9 洛谷上就会 CE,本地能过,编译命令 --std=c++14 -O2 -Wall -Wextra
这是为啥,求大手子指教。

回复

22 条回复,欢迎继续交流。

正在加载回复...