布尔lambda?

Mar*_*cia 2 c++ lambda c++11

为什么这段代码会编译?

现场代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

布尔lambda!(或者boolambdas,如果你愿意......*回避*)

怎么运作?这是另一个GCC错误吗?如果没有,这是标准吗?

Mar*_*cia 7

事实证明它是标准的!

如果你参考这个答案[1],非捕获 lambda可以转换为函数指针.事实证明,作为指针本身的函数指针可以隐式转换为bool!

4.12布尔转换[conv.bool]

1算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue.零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型为std :: nullptr_t的prvalue可以转换为bool类型的prvalue; 结果值为false.

为了给出一个支持证据,证明转换为函数指针是使所有这一切发生的原因,我尝试了捕获lambda的同样的事情.然后生成"无法转换为bool"错误.

现场代码

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

    bool b = lambda;

    if(lambda) {}
}
Run Code Online (Sandbox Code Playgroud)

[1] 老实说,这给了我写这个的想法.