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

自定义range同时使用std::views::join与enumerate时异常

问题:std::views::join与enumerate组合使用时出现未初始化值问题

我实现了一个简单的SequencesRange类,用于迭代生成固定长度的随机基因组序列。单独使用std::views::join拼接所有序列字符时运行正常,但一旦配合std::views::enumerate使用,就会输出垃圾数据,且valgrind检测到“Conditional jump or move depends on uninitialised value(s)”(条件跳转或移动依赖于未初始化值)的问题。

异常现象细节

  • 当可迭代对象的序列长度配置为>=16时,不会出现错误,推测这可能与C++字符串的短字符串优化(SSO)机制有关。

后续测试发现

  • 使用整数哨点的简化迭代器结构时,无此问题;
  • 若修改迭代器的operator*使其返回副本(即value_type operator* () const { return value_; }),问题也能解决,但无法理解为何仅使用join时返回引用即可正常工作,结合enumerate却必须返回副本。

代码示例

#include <string>
#include <iostream>
#include <ranges>

class SequencesRange
{
public:

    struct iterator 
    {
        using iterator_category = std::forward_iterator_tag;
        using value_type        = std::string;
        using difference_type   = long;
        using pointer           = value_type*;
        using reference         = value_type const&;

        iterator (size_t size, size_t nbItems)  : value_(size,' '), nbItems_(nbItems)
        {
            next();
        }

        iterator()                = default;
        iterator(iterator const&) = default;
        iterator(iterator &&    ) = default;

        iterator& operator= (iterator const&) = default;
        iterator& operator= (iterator     &&) = default;

        bool operator!= (const iterator& other) const { return nbItems_ != other.nbItems_; }
        bool operator== (const iterator& other) const { return nbItems_ == other.nbItems_; }

        iterator& operator++ ()    { next();  ++nbItems_;  return *this; }
        iterator  operator++(int)  { iterator tmp = *this;  ++(*this);  return tmp; }

        reference operator* () const { return value_; }

        value_type value_;
        size_t     nbItems_ = 0;
        
        void next()
        {
            static std::array<char,4> letters = {'A','C','G','T'};
            
            for (auto& c : value_)  { c = letters[rand()%letters.size()]; }
        }
    };

public:

    iterator begin() const { return iterator(size,       0); }
    iterator end  () const { return iterator(size, nbItems); }
    
    size_t nbItems = 0;
    size_t size    = 0;
};

int main (int argc, char** argv)
{
    SequencesRange iterable {1, 10};  // 长度为10的单个序列
 
    for (auto [i,nt] : iterable | std::views::join | std::views::enumerate)
    {
        std::cout << nt;  // 此处输出垃圾数据
    }

    // 注意以下代码运行正常:
    //  for (auto nt : iterable | std::views::join)  { std::cout << nt; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:17:07