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

Elv*_*ric 4 c++ gcc clang c++14 c++17

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

谁在这里,c还是gcc?

struct A {
  int value;
};

auto makeCallback(const A& a) {
    auto callback = [aCopy = a](int i) {
    [aCopy, i]() mutable { aCopy.value = i; }();
  };
return callback;
}
Run Code Online (Sandbox Code Playgroud)

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

lub*_*bgr 7

clang是对的。内部闭包aCopy按值捕获,并且进行变异不会影响外部闭包。gcc似乎对相关变量的名称感到困惑。您可以通过给它起一个其他名称来解决此问题。例:

auto callback = [aCopy = a](int i) {
  [anotherName = aCopy, i]() mutable { anotherName.value = i; }();
};
Run Code Online (Sandbox Code Playgroud)

这与clang和一起编译gcc