C++无参数lambda省略调用括号返回1且无-Wall告警是否为预期行为
问题解答
该行为是C++标准的预期设计,返回1的具体原因如下:
你给出的示例代码中,test是无捕获lambda的实例对象,而非函数调用结果,输出逻辑触发了两次合法的隐式转换:
- 无捕获的lambda支持隐式转换为同签名的函数指针:lambda类型本身没有对应的
std::ostream输出重载,编译器会自动将无捕获的test转换为const char*(*)()类型的函数指针。 - 函数指针会优先隐式转换为
bool类型输出:std::ostream没有普通函数指针的专用输出重载,非空的函数指针转换为bool时结果为true,C++默认输出布尔值时会将true序列化为整数1,false序列化为0。你可以尝试在输出前添加std::cout << std::boolalpha;,此时对应的输出会变为true,可以验证该逻辑。 - 补充验证:如果给lambda添加任意捕获(比如将
[](){return "bla";}改为[=](){return "bla";}),lambda将无法隐式转换为函数指针,也没有其他可行的隐式转换规则,代码会直接编译报错,可反向验证上述逻辑。
为什么-Wall编译没有触发告警
-Wall仅开启基础警告集合,上述两次隐式转换都完全符合C++标准的合法操作,没有语法错误或明显运行风险,因此不会触发告警。如果需要检测此类隐式布尔转换,可以额外开启-Wbool-conversion编译选项,GCC、Clang都会针对该场景输出告警提示。
与Pascal语法的差异提示
C语法规则和Pascal不同:C中可调用对象(函数名、lambda、仿函数等)的标识符本身代表的是可调用实体的实例/地址,必须添加()才会触发调用逻辑,无参数时也不允许省略括号,需要适配对应的语法习惯。
内容的提问来源于stack exchange,提问作者Namal
相关产品推荐
相关产品推荐

