C 中lambda表示式中捕獲的值變數存在哪?

時間 2021-12-20 15:57:02

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物件銷毀之前是一直有效,相對應的物件裡的成員也會擁有和前者相同的生命週期。

在lambda表示式中如何使用遞迴

包遵信 這就是大名鼎鼎的 Y Combinator 啊,匿名遞迴是可以實現的。比如要求 n 的階乘,怎麼辦呢?先看階乘的遞迴定義 f n n 0 1 n f n 1 這個定義右側也用到了 f,所以看起來得給 f 起個名字。其實有辦法繞過 先定義這麼乙個 高階 函式 F f lambda n n 0 ...

Java正規表示式捕獲組問題?

李昂 沒有輸出顯然是因為字串中沒有匹配你pattern的,你的pattern是指1到9其中乙個數字出現一次,然後後面跟著零或多個的數字,然後後面再緊接著出現乙個或多個0。另外,你如果是是想1 9的數字出現零次或多次就得寫 0 9 而不是 0 9 d 中文居然能把正規表示式表達得這麼清楚,感覺可以用中...

C語言命題表示式怎麼寫?

運算符號 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...