为什么这段代码会编译?
#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错误吗?如果没有,这是标准吗?
事实证明它是标准的!
如果你参考这个答案[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] 老实说,这给了我写这个的想法.
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |