C ++ 11:没有复制构造函数的基于范围的自定义循环

时间:2018-07-26 15:09:07

标签: c++ c++11 for-loop

我希望有一个基于范围的自定义循环,但没有副本构造函数。似乎在某个时候有副本,但我不明白为什么。

这是我要运行的示例:http://cpp.sh/63pa6

class Range
{
public:
    Range( int begin, int end )
        : iter_( begin ),
          last_( end )
    {
    }
    Range(Range&&) = default;
    Range& operator=(Range&&) = default;

    Range(const Range&) = delete;

    bool operator!=( const Range & /*unused*/ ) const
    {
        return iter_ != last_;
    }

    void operator++()
    {
        ++iter_;
    }

    const Range &begin() const
    {
        return *this;
    }

    const Range &end() const
    {
        return *this;
    }

    int operator*() const
    {
        return iter_;
    }
private:
    int iter_;
    int last_;
};

此代码无法编译:

int main()
{
    for( auto i : Range( 2, 8 ) )
    {
        std::cout << i << std::endl;
    }
}

编译错误:error: use of deleted function 'Range::Range(const Range&)'

2 个答案:

答案 0 :(得分:3)

基于范围produces the following code的范围:

{
  auto && __range = range_expression ; 
  for (auto __begin = begin_expr, __end = end_expr; 
    __begin != __end; ++__begin) { 
    range_declaration = *__begin; 
    loop_statement 
  } 
}

如您所见,这将创建两个副本__begin__end

答案 1 :(得分:0)

我认为定义迭代器包装器会更简单:

struct range : std::pair<int,int> {
    struct int_iter {
        int_iter( int i ) : i(i) {}
        int operator*() { return i; }
        int &operator++() { return ++i; }
        bool operator!=( int_iter end ) const { return i != end.i; }
    private:    
        int i;
    };
    using std::pair<int,int>::pair;
    int_iter begin() const { return int_iter( first ); }
    int_iter end() const { return int_iter(second); }
};

live example

相关问题