2017-09-03 51 views
1

我想將名稱空間變量傳遞給lamba並獲取從lamba函數遞增的變量。在lamba中捕獲命名空間變量

這是我的計劃

// Example program 
#include <iostream> 
#include <string> 
#include <functional> 

using namespace std; 
namespace np 
{ 
    int data = 0; 
} 

int data1 = 0; 

int main() 
{ 
    // cout << np::data <<endl;  // compiler error :unable to capture the variable within namepspace 
    // [&np::data](){ np::data++;}; 
    // cout << np::data <<endl; 

    cout << data1 <<endl; //unable to increment the global variable from lamba 
    [&data1](){ data1++;}; 
    cout << data1 <<endl; 

} 

我有兩個問題:1。 爲什麼我無法從增量蘭巴全局變量? 2.爲什麼lambda無法捕獲名稱空間內的變量?

+1

嘗試此代替:\t汽車值= [&]() \t { \t \t NP ::數據++; \t};值();現在數據的價值將會增加。要回答你的第一個問題:一個具有靜態存儲持續時間的變量不能在lambda中被捕獲 – Asesh

+3

你有一個lambda表達式,但是你沒有調用它的結果,所以顯然它的代碼永遠不會執行。順便說一句,沒有必要明確捕捉全局變量。 –

+0

你永遠不會調用這個lambda。 – Vivick

回答

1

這不是一個完整的答案,但我希望它會有所幫助。

lambda函數的想法是捕獲局部變量,而不是全局變量。如果你想增加一個全局變量,你不需要捕捉到它:

[](){ data1++; np::data++;} // no problem 

的「功能」的拍攝全局變量是有點混亂,而且只存在(我猜測),因爲它們是可見的在功能的模塊:

int data1; 

int main() 
{ 
    int data_local; 
    [&data1,  // superfluous, but works anyway 
    &data_local // useful 
    ](){data1++; data_local++}; 
} 

由於命名空間是不可能的局部,在命名空間中的全局變量不能被捕捉 - 這將是一個無用的特性。在我看來,在命名空間之外捕獲全局變量也是無用的,另外也是令人困惑的,因此如果lambda捕獲這樣的全局變量,那麼發出錯誤會更好。編譯器實際上會爲這種情況發出警告。最後,上面的代碼只是「聲明」一個lambda函數(實際上,它只是「提及」它 - 沒有辦法使用這個「聲明」lambda)。調用它,附加的參數的列表:

[](){data1++;}; // "declaration" 
[](){data1++;}(); // call 
+1

'&data1'不是多餘的,它只是不編譯。 – HolyBlackCat

+0

取決於編譯器;作品[這裏](https://ideone.com/gmtrjI) – anatolyg

+1

[gcc](http://coliru.stacked-crooked.com/a/c313623c56847b0b)和clang都用'-pedantic-errors'拒絕它。 – HolyBlackCat