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

vla*_*don 47 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

value is True!
Run Code Online (Sandbox Code Playgroud)

为什么lambda会评估trueGCC和Clang?MSVC无法构建此(无法将lambda转换为bool).

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

Dei*_*Dei 45

C++ 14标准(第5.1.2节)说:

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

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

因为这个转换操作符与不同的调用约定(超载MSVC无法编译这个__stdcall,__cdecl等).当x64没有使用所有那些调用约定的编译时,所以只有一个转换运算符并且它编译得很好.