Lambda捕获C ++ 14

时间:2014-08-20 15:04:50

标签: c++ lambda c++14

我遇到过这样的符号:

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

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

谢谢!

2 个答案:

答案 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