Lambda捕获C++ 14

Kai*_*dul 8 c++ lambda c++14

我遇到了一个符号:

int x = 4;
auto y = [&r = x, x = x+1]()->int { 
    r += 2;
    return x+2;
}();
Run Code Online (Sandbox Code Playgroud)

你能解释一下这个陈述吗?我是C++ 03的用户,最近升级到C++ 11.从今天起我开始使用C++ 14并遇到了这个片段.

谢谢!

Kai*_*dul 7

感谢@chris的维基百科参考.我找到的是 -

这里有很好的解释,他们不知道旧的lambda Ctures 11的Captures

在C++ 14中:


C++ 11 lambda函数通过value-copy或引用捕获在其外部作用域中声明的变量.这意味着lambda的value成员不能是仅移动类型.C++ 14允许使用任意表达式初始化捕获的成员.这允许通过值移动捕获并声明lambda的任意成员,而不在外部作用域中具有相应命名的变量.

这是通过使用初始化表达式完成的:

auto lambda = [value = 1] {return value;};
Run Code Online (Sandbox Code Playgroud)

lambda函数lambda将返回1,这是value初始化的.声明的捕获从初始化表达式中推断出类型,如同auto.

这可以通过使用标准std::move函数来移动捕获 :

std::unique_ptr<int> ptr(new int(10));
auto lambda = [value = std::move(ptr)] {return *value;};
Run Code Online (Sandbox Code Playgroud)

所以上面的表达式将x更新为6,并将y初始化为7.