C++ 为什么这个lambda可以流化?

C++ 为什么这个lambda可以流化?,c++,c++11,lambda,cout,C++,C++11,Lambda,Cout,令我惊讶的是,下面的代码打印出1 std::cout << [](const char* arg){ return arg[0]=='s'; } << std::endl; std::cout它正在转换为函数指针,然后通过它转换为bool: void foo (); std::cout << &foo << std::endl; voidfoo(); std::我是否认为它正在被转换为bool。有趣的部分是如果std::cin>>[](

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

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

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

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

std::我是否认为它正在被转换为
bool
。有趣的部分是如果
std::cin>>[](const char*arg){return arg[0]=='s';}
工作了;)@lambda首先转换为函数指针,然后通过它转换为bool。我并不知道函数指针在流化时会转换成布尔值,老实说,这很奇怪。根据本标准当前工作草案的8.1.5.1(6),无CaptureLambda具有指向函数指针的转换运算符,并且根据7.14,指针可以隐式转换为bool。关键的一点是,第二次转换是隐式进行的,这就是为什么允许进行两次转换。如果这是第二次用户定义转换,则不会发生。@HenriMenke因为lambdas函数不是真正的“用户定义”,所以我有点惊讶lambda->function pointer被视为用户定义转换。但是,是的,我关于函数指针被流化为布尔值的评论只是说,乍一看,这似乎有点令人惊讶(而且不是很有用)。一旦你想得更清楚一点,这就是一个从几件合理的事情中出现的令人惊讶的行为的例子。
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;