您好,我对有状态的 lambda 表达式有疑问。
这是一个虚拟示例,但在我看来,ms 编译器做错了什么,或者我有一些未定义的行为?
代码:
int main() {
auto start = [x = 1, z = 1]() mutable {
goto resume;
for (; ; ++z) {
for (x = 1; x < z; ++x) {
resume:
std::cout << z;
if (z > 3)
return 1;
}
}
};
start();
}
微软编译器版本 19.16.27024.1
cl -O2/std:c++17 (or -O1, -Ox) -----> 打印'1'然后无限数量的'2'(我认为是错误的)
cl -Od/std:c++17 -----> 打印 12334
g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
g++ -03 -----> 打印 12334
clang 版本 8.0.0(主干) clang++ -O3 -----> 打印 12334
https://godbolt.org/z/wsHYA- (代码但没有 std::cout)
删除 for 循环(这个带有 x 变量)后问题不再可见; 如果有人想知道为什么我写这样的代码 - 我想模仿协程等的行为(没什么大不了的,例如序列生成器)
最佳答案
这是一个优化错误,似乎与内联启动调用有关,因为非内联 lambda 似乎没有错误。
针对这种特殊情况的解决方法是用 do/while 循环替换内部 for 循环和 goto:
auto start = [x = 1, z = 1]() mutable {
for (;; ++z) {
do {
std::cout << z;
if (z > 3)
return 1;
} while (++x < z);
x = 1;
}
};
关于c++ - 有状态 lambda 问题 - Microsoft 编译器版本 19.16.27024.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53874716/