c++ - Visual Studio 2015 中的广义 Lambda 捕获表达式 : Compiler bug or correct behavior?

标签 c++ lambda visual-studio-2015

我正在尝试将 vector 移动到 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

最佳答案

您的代码问题与广义 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
}

关于c++ - Visual Studio 2015 中的广义 Lambda 捕获表达式 : Compiler bug or correct behavior?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39654449/

相关文章:

c++ - 当范围内发生条件时如何重置函数中的变量?

c++ - 推断 "make_function"的 lambda 或任意可调用对象的调用签名

c++ - 错误 LNK2019 : unresolved external symbol ___iob_func referenced in function "void __cdecl Padding(int)"

c# - Visual Studio C# 到 MS Access 连接失败

c++ - 如果 T 不可 move ,则 std::vector<T> 是否可 move ?

c++ - 使用 `\` 符号的 cpp 中的 #define 语法不清楚

c++ - 为什么 C++ 单元测试因 die 程序而失败

c# - C# Lambda 中的可变参数

c# - VS2015 即时窗口中的 lambda 表达式

c# - Xamarin iOS 调试需要永远,不加载模拟器