有状态lambda的问题 - Microsoft编译器版本19.16.27024.1

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想知道我为什么编写这样的代码 - 我想模仿协同程序等的行为(没有什么严重的,例如序列生成器)

120*_*arm 1

这是一个优化错误,似乎与内联启动调用有关,因为非内联 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)