Boolean lambdas?

Boolean lambdas?

本文关键字:lambdas Boolean      更新时间:2023-10-16

这段代码是如何编译的???

实时代码

#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;
}

布尔拉姆达斯!(或者布兰达斯,如果你愿意的话......*回避*)

这是怎么回事?这是另一个 GCC 错误吗?如果不是,这是标准吗?

事实证明,这是标准的!

如果你参考这个答案[1]非捕获 lambda 可以转换为函数指针。再次证明,函数指针本身就是指针,可以隐式转换为bool

4.12 布尔转换 [conv.bool]

1 算术、无作用域枚举、指针或指向成员类型的指针的 prvalue 可以转换为 布尔类型的 prvalue 值。零值、空指针值或空成员指针值将转换为 false; 任何其他值都将转换为 true。类型为 std::nullptr_t 的 prvalue 可以转换为 prvalue 布尔型;结果值为假。

为了提供支持证明,证明转换为函数指针是使这一切发生的原因,我尝试对捕获 lambda 做同样的事情。然后生成"无法转换为bool"错误。

实时代码

int main() {
    int i;
    auto lambda = [i]{};
    bool b = lambda;
    if(lambda) {}
}

[1]老实说,这给了我写这篇文章的想法。