【问题标题】:Is c++11 range-for not equal to classic for in terms of functionality? [duplicate]就功能而言,c++11 range-for 不等于 classic for 吗? [复制]
【发布时间】:2016-04-15 20:43:56
【问题描述】:

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

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 次,第二个循环只打印一次。他们不是平等的吗?这种差异会使旧代码修订复杂化吗?

【问题讨论】:

    标签: c++ c++11 iterator


    【解决方案1】:

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

    没错,因为在第一个循环中,您已要求编译器创建一个新的Range,以将迭代器与每次进入循环时进行比较。

    他们不相等吗?

    没有

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

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

    【讨论】:

    • 在每次循环迭代中重新计算范围结束的做法是不受欢迎的——这是理所当然的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2023-03-09
    • 2021-08-12
    • 2021-11-05
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多