非静态数据成员初始化器中lambda函数的分段错误
Segmentation fault for lambda function in non-static data member initializer
我不确定在非静态数据成员初始化器中捕获this
的lambda函数初始化std::function
时可能存在的GCC错误。这是c++标准允许的吗?
给定以下代码:
#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";
}
在我的理解中,应该打印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; };
没有模板:struct C { int x = 0; std::function<void(int)> f = [this](int v) { x = v; }; };
此外,当使用Clang 3.8.0构建时,所有三个版本的行为都如我所期望的那样,这并不意味着它不是UB。
你不能这样做:
template <typename T>
struct A {
T x = 0;
std::function<void(T)> f = [this](T v) { x = v; };
};
As this
在定义f
时不存在。需要在构造函数中初始化f
,例如:
A(){ f = [this](T v){ x=v; } }
您的代码在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";
}
在cpp.sh上运行原始代码得到:
internal compiler error: in tsubst_copy, at cp/pt.c:12569
Please submit a full bug report
所以我猜这是一个bug
相关文章:
- 尝试使用集合函数时出现分段错误
- 在函数 strcpy() 中访问字符数组时出现分段错误
- 分段 排序函数实现中的错误
- 在 C 函数中返回结构会导致分段错误
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 分段故障 11,从类函数显示动态 C 字符串
- 默认构造函数上的分段错误
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 外部函数在 main() 上调用时返回分段错误 11.(C++)
- 输入处理程序函数中的分段错误
- 在类和构造函数中使用向量时出现分段错误
- 分段错误分配函数结果
- 使用getline和字符串函数C++程序中的分段错误
- 析构函数分段错误链表
- GDB 仅显示发生错误的函数(分段错误)
- 构造函数分段错误
- C++析构函数分段错误
- 节点和二叉树构造函数和析构函数分段
- 调用虚函数-分段故障
- 访问派生类中受保护的成员函数--分段错误