2017-07-26 72 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;};