非静态数据成员初始值设定项中lambda函数的分段错误

And*_*ssi 20 c++ gcc language-lawyer c++11

我不确定在非静态数据成员初始化程序中std::function捕获lambda函数初始化中可能存在的GCC错误this.这是允许的C++标准还是这个UB?

给出以下代码:

#include <functional>
#include <iostream>

template <typename T>
struct A {
      T x = 0;
      std::function<void(T)> f = [this](T v) { x = v; };
};

int main() {
      A<int> a;
      a.f(1);
      std::cout << a.x << "\n";
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,它应该打印1.但是,使用GCC 5.4.0或GCC 6.2.0构建时,a.f(1)会发出分段错误,因为捕获的this指针为空.

以下备选方案按预期工作:

此外,当使用Clang 3.8.0构建时,所有三个版本都按照我的预期运行,这并不意味着它不是UB.

O_Z*_*O_Z 0

您的代码在 VS2015(Windows)上编译并运行。所以这可能是一个编译器错误。

另外,如果您要删除它在http://cpp.sh/上运行的模板, 请尝试以下代码:

#include <functional>
#include <iostream>

struct A {
      int x = 0;
      std::function<void(int)> f = [this](int v) { x = v; };
};

int main() {
      A  a;
      a.f(1);
      std::cout << a.x << "\n";
}
Run Code Online (Sandbox Code Playgroud)

在 cpp.sh 上运行原始代码给出:

 internal compiler error: in tsubst_copy, at cp/pt.c:12569
Please submit a full bug report
Run Code Online (Sandbox Code Playgroud)

所以我猜这是一个错误

  • 在 cpp.sh 上运行原始代码给出:7:35: 内部编译器错误:在 tsubst_copy 中,位于 cp/pt.c:12569 请提交完整的错误报告,所以我猜这是一个错误 (2认同)