c++ - 为什么这个 lambda 可以流式传输?

标签 c++ c++11 lambda cout

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

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

有人可以解释一下吗?

最佳答案

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

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*。函数指针唯一的隐式转换是boolean,当然还有bool的流操作,所以选择了重载,就发生了隐式转换。请参阅:How to print function pointers with cout? .

关于c++ - 为什么这个 lambda 可以流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45002990/

相关文章:

c++ - 如何从qt中的单选按钮获取值?

c++ - 使用 Bazel 构建 Tensorflow

c++ - 为什么拥有多行 constexpr 函数是非法的?

java - LambdaJ:为什么我们不能在 select 子句中应用操作?

python 将 split 和 join 组合成 1 行代码

c++ - iomanip 设置小数点后最多4位

c++ - 使用 iconv 的 UTF8 转换输出不正确

c++ - const 函数上的 std::function 不完整类型

c++ - 将 lambda 放入类定义中的简洁方法

c++ - 函数参数包含完整的函数