2016-09-23 43 views
1

我想一个向量移动到拉姆达,但我得到一个编译错误:Visual Studio 2015中的通用Lambda Capture表达式:编译器错误或正确的行为?

std::vector<int> vec {1,2,3}; 
auto lambda = [vec2 = std::move(vec)](){ 
    vec2.push_back(1); 
} 

该错误是错误C2663:“2个重载有this指针没有法律转换”时,将产生 在该行vec2.push_back(1)

当我改变的例子

std::vector<int> vec {1,2,3}; 
auto lambda = [vec2 = std::move(vec)](){ 
    auto vec3 = std::move(vec2); 
    vec3.push_back(1); 
} 

它编译和作品。

那么这种行为是否正确?如果是这样,为什么vec2不能被修改?

+2

使用'mutable',以便lambda调用不是const。 – Zereges

+0

所以经过快速搜索(见[这里](http://stackoverflow.com/questions/5501959/why-does-c0xs-lambda-require-mutable-keyword-for-capture-by-value-by-defau) )我发现这与移动捕捉没有任何关系,但通过价值捕获总是如此。非常奇怪的是,在使用lambda表达式之后,只有现在我才会遇到这种行为。 – Knitschi

+0

如果你将其中的可变关键字的例子复制到一个答案,我会给你的观点;-) – Knitschi

回答

2

与您的代码的问题不必做任何事情与广义的lambda捕获。默认情况下,lambda的调用操作符为const,因此lambda捕获的对象将被视为const。您可以使用mutable关键字。这将使lambda的呼叫运营商非const允许您修改捕获的对象。

std::vector<int> vec {1,2,3}; 
auto lambda = [vec2 = std::move(vec)]() mutable { 
    vec2.push_back(1); //   ^note 
}