为什么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
所有这些调用约定都没有使用,所以只有一个转换运算符,编译得很好。