#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&amp ;;上评估为true
?铛? MSVC无法构建此(无法将lambda转换为bool)。
这是编译器错误吗?或者标准的哪一段允许这个?
答案 0 :(得分:44)
C ++ 14标准(§5.1.2)说:
非通用lambda表达式的闭包类型,没有 lambda-capture具有公共非虚拟非显式const转换 使用C ++语言链接的指向函数的函数(7.5) 具有与闭包类型相同的参数和返回类型 函数调用运算符。此转换函数返回的值 应该是一个函数的地址,当被调用时,它具有相同的函数 效果为调用闭包类型的函数调用操作符。
由于函数指针可以隐式转换为 cv::VideoCapture cap("udp://@:5001");
if (!cap.isOpened()) {
printf("=ERR= can't create video capture\n");
return -1;
}
,因此您将获得已显示的结果。这是完全合法的。
MSVC不编译它,因为此转换运算符重载了不同的调用约定(bool
,__stdcall
等)。
在编译__cdecl
时,不使用所有那些调用约定,因此只有一个转换运算符,它编译得很好。