首页 > 解决方案 > C++11:没有复制构造函数的自定义基于范围的循环

问题描述

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

这是我想运行的示例: 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&)'

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

解决方案


基于范围的 for 循环产生以下代码

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

如您所见,这会创建两个副本,__begin并且__end.


推荐阅读