Intro
今天晚上和同學聊天提到了C/C++11
,然後注意到了其中的特性之一——也就是匿名函數,亦即Lambda表達式。
所謂匿名函數,最大的特點之一就是這樣的函數可以有名字也可以沒有名字,但它不需要命名就可以定義與使用,這就連帶地使之具有了臨時性。
但是關於C/C++11
的匿名函數(Lambda表達式),我有些東西真的想不通…
下面會以
或
爲例來定義相關函數,以闡述我關於這些匿名函數(Lambda表達式)的觀點。
Node.JS
我們先來看Node.JS
當中的普通函數定義
1 | function psi(x) { |
與匿名函數(Lambda表達式)定義
1 | var psi = (function (x) { |
匿名函數(Lambda表達式)調用起來可以像普通函數一樣
psi(1.)
如若不想讓這個函數占用一個單獨的名字,那麽可以在定義后立即調用,不過調用后亦會即刻銷毀
1 | (function (x) { |
就算是嵌套、複雜的函數亦可以如此這般進行定義
1 | (() => { |
你甚至還可以把 (function (vars¶ms) {...})
簡寫為 ((vars¶ms) => {...})
1 | var psi = ((x) => { |
這是Node.JS
的匿名函數(Lambda表達式),可以説是最靈活的一種。
Python
Python
中的匿名函數真的是用lambda
關鍵字來進行定義的,例如普通地定義函數
1 | def psi(x, y): |
可以用下方的lambda
表達式來替代,但是Python
的lambda
表達式不能表示複雜的函數過程,僅僅適用於一個表達式出返回值的那種。
C/C++
到你C/C++
的匿名函數(Lambda表達式)就神奇了…
1 | ([] (x) { return 128 * x * x + 39; })(1.); |
看網上有這些用法…嗯?什麽意思??
我去網上在一個叫做C++11 FAQ中文版
章節Lambda表達式
中找到了相關的解釋
[&]
是一個捕捉列表(capture list),用於描述將要被lambda函數以引用傳參方式使用的局部變量。如果我們僅想“捕捉”參數v
,則可以寫為:[&v]
。而如果我們想以傳值方式使用參數v
,則可以寫為:[=v]
。如果什麼都不捕捉,則為:[]
。將所有的變量以引用傳遞方式使用時採用[&]
,而相對地,使用[=]
則相應地表示以傳值方式使用所有變量。(譯註:“所有變量”即指lambda表達式在被調用處,所能見到的所有局部變量)
Extra!! about C/C++11
Standard
我所見過的很多同學,使用的C/C++
開發環境是一款稱爲Dev-C++
的老古董,裏面用的是gcc/g++ 4.9.2
,去網上查了查,支持的編譯標準似乎只到C/C++98
…
其實除了用不了auto
之外也沒什麽,雖説現在的gcc/g++
都已經更新到第九代了…支持的標準也是2017年的C/C++17
了…
References
zhzz2012
- cpp11新特性講解與應用 https://blog.csdn.net/zhzz2012/article/details/52151660/- C++11 FAQ中文版 Lambda表達式 https://wizardforcel.gitbooks.io/cpp-11-faq/content/18.html
- https://isocpp.org/wiki/faq/cpp11/