You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ranges管道中使用成员投影引发stack-use-after-return问题排查

C++ Ranges管道中stack-use-after-return错误的疑问

代码定义

我定义了包含int成员的结构体S,以及一个接收int参数并返回S实例的函数f:

struct S {
    int i;
};

S f(int) {
    return {42};
}

问题场景与错误

我在Ranges管道中使用上述函数:

auto r = std::views::iota(5, 10) 
       | std::views::transform(&f) 
       | std::views::transform(&S::i);

这段代码调用std::ranges::size(r)时能正常执行,但尝试访问任意元素(比如auto n = r.front();)时,AddressSanitizer会抛出stack-use-after-return错误,该问题在Clang和GCC中均会出现。

修复后的代码

将第二个transform中的&S::i替换为lambda实现后,错误消失:

auto r = std::views::iota(5, 10) 
       | std::views::transform(&f)
       | std::views::transform([](S const & s) {
            return s.i;
        });

auto n = r.front(); // 无错误

疑问

如果返回的S对象存在生命周期问题,两种情况应该都会触发错误,为何使用成员投影&S::i和lambda会有此差异?

内容的提问来源于stack exchange,提问作者cigien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:55:00