1樓:0cch
上面的回答都不準確。
這裡其實涉及到了兩個知識點,第一是lambda表示式的捕獲值,第二是function的實現機制。
其實,我們可以簡單的將lambda表示式理解為仿函式,這裡的lambda表示式[=
]()mutable
->int&
;其實相當於
struct
some_func
};function
()>funfunc(); }所以這裡很明顯,捕獲的值是作為資料成員儲存在lambda表示式產生的物件中。 接下來是另外乙個問題,為什麼在main函式中引用區域性變數沒有問題呢?這是因為返回的function物件會儲存lambda表示式的副本,這個副本可能是在構造的時候通過new運算子在堆中產生的,也有可能是通過replace new直接在棧上產生,取決於儲存物件型別的大小。 template _Fty >class function :public _Get_function_impl <_Fty >:: type // ... };template _Ret ,class ..._Types >class _Func_class :public _Arg_types <_Types ...> using _Impl =_Func_impl_no_alloc <_Fx> ,_Ret ,_Types ...>;if constexpr (_Is_large <_Impl >)else }// ... };所以function裡指標指向的物件在function物件銷毀之前是一直有效,相對應的物件裡的成員也會擁有和前者相同的生命週期。 包遵信 這就是大名鼎鼎的 Y Combinator 啊,匿名遞迴是可以實現的。比如要求 n 的階乘,怎麼辦呢?先看階乘的遞迴定義 f n n 0 1 n f n 1 這個定義右側也用到了 f,所以看起來得給 f 起個名字。其實有辦法繞過 先定義這麼乙個 高階 函式 F f lambda n n 0 ... 李昂 沒有輸出顯然是因為字串中沒有匹配你pattern的,你的pattern是指1到9其中乙個數字出現一次,然後後面跟著零或多個的數字,然後後面再緊接著出現乙個或多個0。另外,你如果是是想1 9的數字出現零次或多次就得寫 0 9 而不是 0 9 d 中文居然能把正規表示式表達得這麼清楚,感覺可以用中... 運算符號 0 非 1 與 2 或 3 條件 4 雙條件 5 排斥或 6 異或 int GetIndex char Str,charCh return 1 bool CharToBool charCh return true boolTJ boola,boolb bool STJ boola,bool...在lambda表示式中如何使用遞迴
Java正規表示式捕獲組問題?
C語言命題表示式怎麼寫?