c ++ 11范围 - 在功能方面不等于经典吗?

时间:2016-04-15 20:43:56

标签: c++ c++11 iterator

人们会期望它们以完全相同的方式工作,但是。

class Range
{
public:
    class DontMindMe
    {
    public:
        DontMindMe(int a) : a_(a) {}
        bool operator ==(const DontMindMe& ot) {return a_ == ot.a_;}
        bool operator !=(const DontMindMe& ot) {return !(*this==ot);}
        int operator *(void) {return a_;}
        DontMindMe& operator++() {++a_; return *this;}
        DontMindMe  operator++(int) {auto temp{*this}; ++a_; return temp;}
    private:
        int a_;
    };

    Range(int a, int b, const std::string& msg)
        : a_(a), b_(b) {std::cout << msg << std::endl;}
    DontMindMe begin() {return a_;}
    DontMindMe end() {return b_;}
private:
    int a_;
    int b_;
};

int main()
{
    for(auto it = Range::DontMindMe(1); it != Range(1,10, "C++").end(); ++it);

    std::cout << std::endl;

    for(auto it : Range(1,10, "C++11")); 
}

第一个循环打印消息10次,第二次打印只打印一次。他们不平等吗?这种差异会使旧代码修订变得复杂吗?

1 个答案:

答案 0 :(得分:3)

  

第一个循环打印消息10次,第二次打印只打印一次。

这是正确的,因为在第一个循环中,您已经要求编译器创建一个新的Range来比较每次进入循环时的迭代器。

  

他们不平等吗?

没有

  

这种差异会使旧代码修订变得复杂吗?

通常不会。只是你创造了一个人为的例子。