2

这段代码怎么编译???

实时代码

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

4

1 回答 1

7

原来它是标准的!

如果您参考此答案[1],则非捕获lambda 可以转换为函数指针。事实证明,函数指针本身就是指针,可以隐式转换为bool

4.12 布尔转换 [conv.bool]

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

为了证明转换为函数指针是导致这一切发生的原因,我尝试通过捕获 lambda 来做同样的事情。然后生成“无法转换为bool”错误。

实时代码

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

    bool b = lambda;

    if(lambda) {}
}

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

于 2013-09-19T08:40:59.487 回答