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
相关产品推荐
相关产品推荐

