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;
}

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

最佳答案

clang是正确的。内部闭包通过值捕获aCopy,并且进行不影响外部闭包的变异。 gcc似乎被有关变量的名称混为一谈。您可以通过给它起另一个名字来解决此问题。例子:

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

这将同时使用clanggcc进行编译。

关于c++ - 在嵌套Lambda : gcc vs clang?中修改捕获的参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57920265/

10-11 22:50
查看更多