通过复制将数组地址传递给匿名函数失败
Fail to pass array address by copy to anonymous function
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];
});
}
错误:只读位置' arr[((int)num)] ' ++arr[num];
问题>为什么我看到上面的错误?如果匿名函数需要修改该值,则需要在[]
的参数前加上&
。然而,在这里,我传入一个数组的地址。为什么我仍然要用[&arr]
而不是[arr]
。
谢谢
数组不是指针。arr
不是指针,它是一个数组。标准中没有任何地方说在lambda捕获时发生数组到指针的转换。所以不是捕获指针,而是捕获实际的数组,通过值或引用。由于按值捕获实际上是const
,除非lambda声明为mutable
,否则您将得到错误。
换句话说,在[&arr]
的情况下,lambda的闭包类型将具有该数据成员:
int (&arr)[3];
这个数据成员在[arr]
的情况下:
int arr[3];
不要忘记,当lambda声明没有mutable
时,闭包的operator()
是const
成员函数:
auto operator() (const int& num) const -> void {
// ... code
}
这意味着它不能修改由value捕获的数据成员。
lambda将arr捕获为const。如果你希望能够修改数组,你需要使用mutable:
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) mutable -> void {
++arr[num];
});
}
或者,更准确地说,lambda表达式就像一个没有可变的关键字的const函数:
5.1.2.5 lambda表达式的闭包类型有一个公共内联函数调用操作符(13.5.4),其形参和返回类型为由lambda表达式的参数声明子句和描述trailing-return-type分别。这个函数调用操作符是声明const(9.3.1)当且仅当lambda表达式为参数声明子句后面没有mutable
相关文章:
- 函数返回时,带指针的复制构造函数失败
- 为什么 std::get<T> 其中 T 是调用 constexpr 函数失败的结果?
- 在 if 语句中调用重载构造函数失败
- 使用特征函数失败
- 为什么通过通用引用运算符 (&&) 将变量的引用传递给 Varadic 模板函数失败?
- 为什么我的代码在没有 chroot 函数的情况下工作,但使用 chroot 函数失败?
- 非常量调用 const 成员函数失败,只读位置C++
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- C++模板化类默认构造函数失败
- STD :: MAP EMPLECE通过显式构造函数失败
- 为什么 std::apply 使用泛型函数失败
- 从返回绑定中获取函数失败
- 运算符 == 重载函数失败
- 打开不存在的文件时如何使流构造函数失败?
- 为线程构造函数传递引用以将其绑定到函数失败
- 显式DLL 1函数失败
- 模板参数扣除/替换使用Lambda表达式使用高阶函数失败
- 来自(QT)插件的调用函数失败
- 什么错误的逻辑导致我的链表的这个 push_back(..) 函数失败?
- 复制构造函数失败..重载,动态分配