为什么这段代码会编译???
#include <iostream>
int main() {
auto lambda1 = []{};
auto lambda2 = []{};
if(lambda1 && lambda2) {
std::cout << "BOOLEAN LAMBDAS!!!" << std::endl;
}
if(lambda1 || lambda2) {
std::cout << "BOOLEAN LAMBDAS AGAIN FTW!!!" << std::endl;
}
bool b1 = lambda1;
bool b2 = lambda2;
std::cout << b1 << ", " << b2 << std::endl;
}
布尔lambda! (或者boolambdas,如果你愿意...... *回避*)
为什么会这样?这是另一个GCC错误吗?如果没有,这是标准吗?
答案 0 :(得分:7)
事实证明它是标准的!
如果您引用this answer [1] ,非捕获 lambdas可转换为函数指针。事实证明,作为指针本身的函数指针可以隐式转换为bool
!
4.12布尔转换[conv.bool]
1 算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为 bool类型的prvalue。零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。类型为std :: nullptr_t的prvalue可以转换为prvalue 类型bool;结果值为false。
为了给出一个支持证据,证明转换为函数指针是导致所有这一切发生的原因,我已经尝试过捕获lambdas做同样的事情。然后生成“无法转换为bool
”错误。
int main() {
int i;
auto lambda = [i]{};
bool b = lambda;
if(lambda) {}
}
[1] 老实说,这给了我写这个的想法。