C++ Visual Studio 2015中的广义Lambda捕获表达式:编译器错误还是正确行为?

C++ Visual Studio 2015中的广义Lambda捕获表达式:编译器错误还是正确行为?,c++,lambda,visual-studio-2015,C++,Lambda,Visual Studio 2015,我试图将向量移动到lambda中,但出现编译错误: std::vector<int> vec {1,2,3}; auto lambda = [vec2 = std::move(vec)](){ vec2.push_back(1); } 它编译并运行 那么这种行为正确吗?如果正确,为什么不能修改vec2?代码的问题与广义lambda捕获无关。默认情况下,lambda的调用操作符是const,因此,lambda捕获的对象将被视为const。您可以使用mutable关键字。这将

我试图将向量移动到lambda中,但出现编译错误:

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


那么这种行为正确吗?如果正确,为什么不能修改
vec2

代码的问题与广义lambda捕获无关。默认情况下,lambda的调用操作符是
const
,因此,lambda捕获的对象将被视为
const
。您可以使用
mutable
关键字。这将使lambda的call操作符成为non-
const
,允许您修改捕获的对象

std::vector<int> vec {1,2,3};
auto lambda = [vec2 = std::move(vec)]() mutable {
     vec2.push_back(1); //              ^ note
}
std::向量向量{1,2,3};
自动lambda=[vec2=std::move(vec)]()可变{
vec2.向后推(1);/^注意
}

使用
mutable
,这样lambda调用就不是常量了。所以在快速搜索(请参阅)之后,我发现这与移动捕获无关,但在按值捕获时总是如此。非常奇怪的是,在使用lambdas这么久之后,直到现在我才遇到这种行为。如果您将带有可变关键字的示例复制到一个答案中,我会给您分数;-)
std::vector<int> vec {1,2,3};
auto lambda = [vec2 = std::move(vec)]() mutable {
     vec2.push_back(1); //              ^ note
}