修改嵌套 lambda 中捕获的参数:gcc 与 clang?

Modifying captured parameters in nested lambda: gcc vs clang?

本文关键字:gcc clang 参数 lambda 嵌套 修改      更新时间:2023-10-16

我在从clang切换到gcc时遇到了奇怪的行为。clang成功编译代码,同时gcc报告错误。下面是重现该行为的最小示例。我已经尝试过c++14c++17有多个clanggcc版本。

谁就在这里,叮当还是 gcc?

struct A {
int value;
};
auto makeCallback(const A& a) {
auto callback = [aCopy = a](int i) {
[aCopy, i]() mutable { aCopy.value = i; }();
};
return callback;
}

编辑: 将外部 lambda 更改为mutable,解决了gcc上的问题。

clang是对的。内部闭合按值捕获aCopy,并且更改不会影响外部闭合。gcc似乎对所讨论变量的相同名称感到困惑。您可以通过为其指定另一个名称来解决此问题。例:

auto callback = [aCopy = a](int i) {
[anotherName = aCopy, i]() mutable { anotherName.value = i; }();
};

这同时使用clanggcc进行编译。