2016-01-13 76 views
75

我想知道[=]是做什麼的?這裏有一個簡單的例子C++ - [=]做什麼?

template <typename T> 
std::function<T (T)> makeConverter(T factor, T offset) { 
    return [=] (T input) -> T { return (offset + input) * factor; }; 
} 

auto milesToKm = makeConverter(1.60936, 0.0); 

將如何與[]代替[=]代碼工作?

std::function<T (T)> 

指函數原型它得到(T)作爲參數和返回值類型T

+0

這是奇怪的高度投票似乎要問3個不同的未經研究的問題,並且是[什麼是C++ 11中的lambda表達式?]的副本(https://stackoverflow.com/questions/7627098/what -is-a-lambda-expression-in-c11) –

回答

96

您所指的[=]是用於lambda表達式的捕獲列表的一部分。這告訴C++,lambda表達式中的代碼被初始化,以便lambda獲得它創建時使用的所有局部變量的副本。這對於lambda表達式能夠引用factoroffset是必要的,它們是函數內部的局部變量。

如果您在[=][]代替,你會得到一個編譯器錯誤,因爲lambda表達式中的代碼將不知道什麼變量offsetfactor參考。如果你這樣做,許多編譯器會給出好的診斷錯誤信息,所以試試看看會發生什麼!

+12

「這是必須的」 - 這個確切的選項是沒有必要的;我們也可以編寫'[&]','[= offset,= input]'等等。 –

+1

@ M.M - 這不是捕獲對當地人的引用嗎? – Useless

+5

@ M.M。在這裏使用引用捕獲會是一個問題,因爲這些局部變量的生命週期將在lambda返回時立即結束。不過,你說得對,我們可以單獨列出各個變量。 – templatetypedef

33

這是一個lambda捕獲列表。使變量可用於lambda。您可以使用按照價值複製的[=],或[&],它通過引用傳遞。

+2

你也可以使用不捕獲任何東西的'[]'。 :) –

+0

是的,沒錯。 :-) – kometen