为什么这个 lambda 是可流式传输的?

Why is this lambda streamable?

本文关键字:传输 lambda 为什么      更新时间:2023-10-16

令我惊讶的是,以下代码打印1.

std::cout << [](const char* arg){ return arg[0]=='s'; } << std::endl;

有人可以解释一下吗?

它正在转换为函数指针,然后通过它转换为布尔值:

void foo ();
std::cout << &foo << std::endl;

打印相同的内容和相同的警告;我碰巧使用 gcc 设置为 17 标准进行编译,我看到:

main.cpp:6:56: warning: the address of 'static constexpr bool main()::<lambda(const char*)>::_FUN(const char*)' will never be NULL [-Waddress]
std::cout << [](const char* arg){ return arg[0]=='s'; } << std::endl;

使用上面的代码,您会看到相同的警告。

补充一点我的答案:void*有一个流过载.但是,与指向数据的指针不同,函数指针不能隐式转换为void*。函数指针的唯一隐式转换是布尔值,当然布尔值有一个流操作,因此选择重载并发生隐式转换。请参阅: 如何使用 cout 打印函数指针?。