为什么 lambda 会转换为值为真的布尔值?

Why does a lambda convert to a bool whose value is true?

本文关键字:真的 布尔值 为什么 转换 lambda      更新时间:2023-10-16
#include <iostream>
void IsTrue(const bool value) {
if (value) {
std::cout << "value is True!n";
}
}
int main()
{
IsTrue([]() { ; /* some lambda */ });
return 0;
}

输出:

value is True!

为什么lambda在GCC和Clang上的计算结果为true?MSVC 无法构建此值(无法将 lambda 转换为布尔值)。

是编译器错误吗?或者标准的哪一段允许这样做?

C++14 标准 (§5.1.2) 说:

没有 lambda 捕获的非泛型 lambda 表达式的闭包类型具有公共非虚拟非显式 const函数到指向具有C++语言链接的函数的指针(7.5) 具有与闭包类型相同的参数和返回类型 函数调用运算符。此转换函数返回的值 应是函数的地址,该函数在调用时具有相同的 作为调用闭包类型的函数调用运算符的效果。

由于函数指针可隐式转换为bool,因此您可以获得所显示的结果。这是完全合法的。

MSVC 不会编译它,因为这个转换运算符重载了不同的调用约定(__stdcall__cdecl等)。 编译时x64不使用所有这些调用约定,因此只有一个转换运算符,并且可以正常编译。