c++ - 无法通过复制到匿名函数来传递数组地址

标签 c++ c++11

void F(int A[], int n) { // Correct
    int arr[3] = {0}; // A[..] in the range of 0-2
    for_each(A, A+n, [&arr](const int& num) -> void {
       ++arr[num];
    });
}

void F(int A[], int n) { // Wrong: b/c [arr] should be [&arr]
    int arr[3] = {0}; // A[..] in the range of 0-2
    for_each(A, A+n, [arr](const int& num) -> void {
       ++arr[num];
    });
}

error: increment of read-only location ‘arr[((int)num)]’ ++arr[num];

问题> 为什么我看到上面的错误? 如果匿名函数需要修改值,[]中的参数需要加上&前缀。但是,在这里,我传入了一个数组地址。为什么我仍然必须使用 [&arr] 而不是 [arr]

谢谢

最佳答案

数组不是指针。 arr 不是一个指针,它是一个数组。标准没有任何地方说数组到指针的转换发生在 lambda 捕获上。所以 lambda 不是捕获指针,而是通过值或引用捕获实际数组。由于按值捕获实际上是 const,除非 lambda 被声明为 mutable,您会收到错误。

换句话说,lambda 的闭包类型将在 [&arr] 情况下具有此数据成员:

int (&arr)[3];

[arr] 案例中的这个数据成员:

int arr[3];

不要忘记,当 lambda 声明时没有 mutable,闭包的 operator() 是一个 const 成员函数:

auto operator() (const int& num) const -> void {
  // ... code
}

这意味着它不能修改按值捕获的数据成员。

关于c++ - 无法通过复制到匿名函数来传递数组地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24680321/

相关文章:

c++ - 为什么这些 vector 不相等?

c++ - 什么时候可以在函数及其参数之间插入未排序的代码?

c++ - 在 C++ 中获取拉丁字符

NSOperation 和 NSOperationQueue 的 C++ 等价物

C++ 实验性/文件系统 remove_all

c++ - 链接 vector 类的问题

c++ - 显示属于树的深度路径的二叉搜索树的节点

c++ - 'auto' 关键字是否知道何时使用 const 迭代器?

c++ - 现在从 C++11 中的 "return"语句到 "switch"是错误的吗?

c++ - 带文字列表的范围 for 循环?