C++ Visual Studio 2015中的广义Lambda捕获表达式:编译器错误还是正确行为?
我试图将向量移动到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关键字。这将
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
}