Krz*_*eld 6 c++ lambda compiler-bug
嗨我有状态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();
}
Run Code Online (Sandbox Code Playgroud)
Microsoft编译器版本19.16.27024.1
cl -O2/std:c ++ 17(或-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 version 8.0.0(trunk)clang ++ -O3 ----->打印12334
https://godbolt.org/z/wsHYA-(代码但没有std :: cout)
删除for循环后(这个带有x变量)问题不再可见; 如果somone想知道我为什么编写这样的代码 - 我想模仿协同程序等的行为(没有什么严重的,例如序列生成器)
这是一个优化错误,似乎与内联启动调用有关,因为非内联 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;
}
};
Run Code Online (Sandbox Code Playgroud)