为什么lambda会转换为值为true的bool?

时间:2017-01-18 13:41:13

标签: c++ lambda boolean language-lawyer

#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)。

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

1 个答案:

答案 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时,不使用所有那些调用约定,因此只有一个转换运算符,它编译得很好。