Почему эта лямбда является водонепроницаемой?

К моему удивлению, следующий код печатает 1.

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

Может кто-нибудь объяснить это, пожалуйста?

Ответ 1

Он преобразуется в указатель на функцию, а затем через это через 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*. Единственное неявное преобразование для указателей на функции является логическим, и, конечно, для bool существует операция потока, поэтому происходит перегрузка и происходит неявное преобразование. См. Как напечатать указатели на функции с помощью cout?.