我不确定在非静态数据成员初始化程序中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指针为空.
以下备选方案按预期工作:
使用构造函数初始化列表:
template <typename T>
struct B {
B() : f([this](T v) { x = v; }) {}
T x = 0;
std::function<void(T)> f;
};
Run Code Online (Sandbox Code Playgroud)没有模板:
struct C …Run Code Online (Sandbox Code Playgroud)