为什么lambda转换为值为true的布尔值?

#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不能build立这个(不能转换lambda到布尔)。

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

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

lambda捕获 的非genericslambdaexpression式的闭包types 有一个公共的非虚拟非显式const转换 函数,指向具有与闭包types相同的参数和返回types的C ++语言链接(7.5)函数调用操作符。 这个转换函数返回的值应该是被调用的函数的地址,和调用闭包types的函数调用操作符一样。

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

MSVC不编译这个,因为这个转换运算符重载不同的调用约定( __stdcall__cdecl等)。 在编译x64所有这些调用约定都没有使用,所以只有一个转换运算符,编译得很好。