Boolean lambdas?
Boolean lambdas?
这段代码是如何编译的???
实时代码
#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]老实说,这给了我写这篇文章的想法。
相关文章:
- 为什么在C++20中对lambdas使用"std::bind_front"
- JavaScript箭头函数:我们能否像C ++ lambdas一样捕获值
- 使用lambdas初始化多维数组
- C++17中没有自动参数的模板lambdas
- 通过引用捕获与移动,lambdas
- 我可以使用匿名lambdas坚持静态值
- lambdas的可继承性是否由标准保证
- C ;使用lambdas在类中有条件地扩展功能(MWE的SEG故障)
- 在具有功能的C++中嵌套无捕获的lambdas?
- Templated Variables Bug With Lambdas in Visual Studio?
- C 使用多个lambdas/绑定以引用相同的功能
- 直接将lambdas传递到函数
- 使QTConcurrent ::映射与Lambdas一起工作
- C 中的枚举和lambdas的地图
- STD ::仅移动的Lambdas的向量是可能的
- Lambdas的C 向量 - 未定义的参考
- 将信号连接到QT5中的C 11 lambdas
- 递归lambdas和本地参考
- 班级成员在C Lambdas中捕获内部构造函数
- Boolean lambdas?