布尔lambda?

时间:2013-09-19 08:40:59

标签: c++ c++11 lambda

为什么这段代码会编译???

LIVE CODE

#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错误吗?如果没有,这是标准吗?

1 个答案:

答案 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”错误。

LIVE CODE

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

    bool b = lambda;

    if(lambda) {}
}

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