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

时间:2016-09-23 06:55:25

标签: c++ lambda visual-studio-2015

我正在尝试将矢量移动到lambda中,但是我收到了编译错误:

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不能被修改?

1 个答案:

答案 0 :(得分: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
}