gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:44 25 4
gpt4 key购买 nike

您好,我对有状态的 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/

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