C++中Lambda被转换为nullptr导致无输出的问题排查
问题原因分析
你的代码出现无输出的核心问题,是数组元素初始化时的双层大括号导致编译器无法正确将Lambda转换为std::function<void()>,反而让A的构造函数接收到了一个空的std::function(等价于nullptr)。
具体细节拆解
- 类
A不是聚合体:因为A定义了用户自定义的构造函数,所以它不能用聚合初始化(即用大括号直接初始化成员变量的方式)。 - 错误的初始化语法:你在
B类里写的A array[1] = { { [=]() { std::cout << "hello"; } } };用了双层大括号。外层大括号是数组的初始化列表,内层大括号本应是传递给A构造函数的参数,但编译器会错误地将内层大括号当成尝试对A进行聚合初始化——但A的callback成员是私有的,且A有自定义构造函数,这种初始化方式不合法。 - 编译器的妥协行为:有些编译器没有直接报错,而是退而求其次,默认构造了
std::function<void()>(也就是nullptr)传递给A的构造函数,这就导致trigger()调用时没有执行任何逻辑。
修复方案
只需要去掉一层多余的大括号,让Lambda直接作为参数传递给A的构造函数:
class B { public: A array[1] = { [=]() { std::cout << "hello"; } }; };
或者显式调用A的构造函数(可读性更好):
class B { public: A array[1] = { A([=]() { std::cout << "hello"; }) }; };
这样Lambda就能正常隐式转换为std::function<void()>,调用trigger()时就会输出"hello"了。
内容的提问来源于stack exchange,提问作者Mathieu pasquet
相关产品推荐
相关产品推荐

