gpt4 book ai didi

c++ - 使用 lambda 在 if else 语句中返回一个 bool 值

转载 作者:太空狗 更新时间:2023-10-29 23:35:41 24 4
gpt4 key购买 nike

这是我的代码:

int main(int argc, char** argv) {
bool gg;
if( [&]()->decltype(gg){

return false; //try changing this to true or false and you'll get the same result.

} ){

std::cout<<"all even"<<std::endl;
}else {
std::cout<<"all odd"<<std::endl;
}


return 0;
}

这很简单,我有一个 if else 语句和一个检查条件的 lambda 函数。我不知道它是代码还是编译器,但即使我将 false 更改为 true,反之亦然,我也会得到相同的结果。我正在使用开发 CPP。我的代码有什么问题?

最佳答案

5.1.2 Lambda expressions

6 The closure type for a lambda-expression with no lambda-capture has a public non-virtual non-explicit const conversionfunction to pointer to function having the same parameter and returntypes as the closure type’s function call operator. The value returnedby this conversion function shall be the address of a function that,when invoked, has the same effect as invoking the closure type’sfunction call operator.

这正是您的情况。您忘记调用闭包对象的 () 运算符。相反,您使用闭包对象本身作为 if 中的条件。

由于您的闭包对象不捕获任何内容,根据 5.1.2/6,它可以隐式转换为普通函数指针类型 bool (*)()。所以你的对象被隐式转换为函数指针。由于指针不为空,因此它在 if 下充当 true

换句话说,你的代码被编译器按照以下方式解释

bool gg;
auto lf = [&]() -> decltype(gg) { return false; };

bool (*f)() = lf;
if (f) {
...

如果您让 lambda 函数实际捕获某些内容(例如,将 return false; 替换为 return gg;),您的原始代码将立即无法编译。

附言正如您在下面的评论中看到的那样,[&] 的存在显然应该为您的 lambda 禁用 5.1.2/6。但显然您的编译器更宽松地对待 5.1.2/6 并查找实际捕获,而不是简单地检查是否存在非 [] 捕获子句。

关于c++ - 使用 lambda 在 if else 语句中返回一个 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31602985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com