2016-06-21 133 views
14

我在看下面的(大概是C++ 14)的代碼分配拉姆達

auto min_on = [](auto&& f) { 
    return [f=decltype(f)(f)](auto&& arg0, auto&&...args) { 
    // call your function here, using decltype(args)(args) to perfect forward 
    }; 
} 

是什麼在lambda捕獲列表怪異的分配?我從未在捕獲列表中看到過任務

f=decltype(f)(f) 

這是如何工作的?

+0

當你返回一個函數時,你可以立即調用它 –

回答

14

這就是所謂的Generalized Lambda Capture,是的,它是C++ 14。

基本上它允許你創建一個新的變量作爲捕獲列表的一部分。從鏈路

文本:

在C++ 11,lambda表達式不能(容易地)通過移動捕獲。在C++ 14中,我們有 廣義lambda捕獲,它不僅解決了這個問題,而且 允許您在lambda表達式中定義任意新的局部變量 對象。例如:

auto u = make_unique<some_type>(some, parameters); // a unique_ptr is move-only 
go.run([ u=move(u) ] { do_something_with(u); }); //move the unique_ptr into the lambda 

在上面的例子中,我們保留了變量u拉姆達內相同的 名稱。但我們不 僅限於......我們可以重命名變量:

go.run([ u2=move(u) ] { do_something_with(u2); }); // capture as "u2" 

我們可以任意添加新的狀態到拉姆達對象,因爲 每個捕獲創建 拉姆達內一個新的類型推斷的局部變量:

int x = 4; 
int z = [&r = x, y = x+1] { 
      r += 2;   // set x to 6; "R is for Renamed Ref" 
      return y+2;  // return 7 to initialize z 
     }(); // invoke lambda 

在特定情況下,您有返回拉姆達一個lambda。通過使用這種新語法,嵌套lambda捕獲f(它只是父lambda中的一個參數)。

+3

我會補充一點,在這種情況下'decltype(f)(f)'是一種寫'std :: forward (f)實際上命名'T'。 – Brian

+0

@Brian你在說什麼? – Dean

+0

@Dean推導爲'auto'佔位符的類型。 – Brian