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/