2017-07-26 222 views
3

我有下面一個快速測試:C++ 11:可變的lambda似乎沒有改變變量?

#include<iostream> 
using namespace std; 
int main(){ 
    int i=2; 
    auto f=[=]()mutable{++i;}; 
    f(); 
    f(); 
    cout<<i<<endl; 
    return 0; 
} 

但結果仍然打印「2」。爲什麼我不在可變的lambda裏面修改?我正在使用clang --std = C++ 1z。

謝謝!

回答

7
int i=2; 
auto f=[=]()mutable{++i;}; 
f(); 
f(); 
std::cout<<i<<std::endl; 

此打印2.

int i=2; 
auto f=[&](){++i;}; 
f(); 
f(); 
std::cout<<i<<std::endl; 

此打印4.

int i=2; 
auto f=[=]()mutable{++i; std::cout << i << std::endl;}; 
f(); 
f(); 
std::cout<<i<<std::endl; 

此打印3 4 2

=拷貝捕獲d數據導入lambda。

如果mutable副本可以修改。

&參考文獻在lambda中捕獲的數據。

通過引用修改事物是合法的。

[=]相同[i],並[&]是一樣的在這方面[&i](你可以明確地列出捕獲,或讓他們可以通過上市,並沒有使用=&隱含捕獲)。

9

您使用[=]作爲您的捕獲,這意味着lambda獲得i的副本。該副本獨立於main中的i

您需要執行的操作是通過引用[&]進行捕獲,以便對main中的i應用更改。

+2

如果lambda打印出它自己的'i'副本,這可能有助於說明差異。然後你會看到它的值不同於'main'的範圍中的'int i'。 –

2

[=]表示您按值捕獲i。即使是可變的lambda也可以修改它,但它只是lambda中的一個副本,那麼對它的任何修改都與原始變量無關。

您可能想要capture-by-reference,然後mutable不再需要。例如

auto f = [&i]() {++i;};