我遇到过这样的符号:
int x = 4;
auto y = [&r = x, x = x+1]()->int {
r += 2;
return x+2;
}();
你能解释一下这句话吗?我是C ++ 03的用户,最近升级到C ++ 11。从今天起我开始使用C ++ 14并遇到了这个片段。
谢谢!
答案 0 :(得分:7)
感谢@chris为wikipedia reference。我发现的是 -
Here is nice explanation who don't know about the old lambda Captures of C++11
在C ++ 14中:
C ++ 11 lambda函数捕获在其外部作用域中声明的变量 通过价值复制或通过引用。这意味着一个值的成员 lambda不能是仅移动类型。 C ++ 14允许捕获的成员 用任意表达式初始化。这允许两者捕获 value-move和声明lambda的任意成员,没有 在外部范围内具有相应命名的变量。
这是通过使用初始化表达式完成的:
auto lambda = [value = 1] {return value;};
lambda函数
lambda
将返回1,这是value
用。初始化。声明的捕获从中推断出类型 初始化表达式,如同auto
。这可用于通过移动,通过使用标准来捕获
std::move
功能:std::unique_ptr<int> ptr(new int(10)); auto lambda = [value = std::move(ptr)] {return *value;};
因此上面的表达式将x更新为6,并将y初始化为7。
答案 1 :(得分:0)
此示例是C ++ 14功能“ Lambda捕获初始化程序”的一部分,它允许创建使用任意表达式初始化的lambda捕获。 使用此引用捕获,可以使用与引用变量不同的名称。
如果您运行代码:
int x = 4;
auto y = [&r = x, x = x+1]()->int {
r += 2; //r=6
return x+2;//5+2
};
cout<<y()<<endl; // this will print 7