【发布时间】:2017-06-02 22:10:52
【问题描述】:
#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 无法构建它(无法将 lambda 转换为 bool)。
这是一个编译器错误吗?或者标准的哪一段允许这样做?
【问题讨论】:
-
不确定这是否合法,但它似乎将 lambda 转换为函数指针,然后将该值(非空)用于 bool 以便编译。如果您添加捕获it fails to compile。
-
MSVC 有a nonstandard extension,所以需要你明确拼出目标函数指针类型,否则转换会失败。
-
@NathanOliver 是的,这是合法的,请参阅[conv.bool]
标签: c++ lambda boolean language-lawyer